A expressão CASE
Lógica IF/THEN dentro de uma consulta.
A expressão CASE é uma aula grátis de SQL Academy no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de SQL Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de SQL Academy inclui 4 aulas no total.
Lógica condicional em SQL
Às vezes, você precisa que uma consulta tome uma decisão: se isto, então aquilo; caso contrário, outra coisa. O SQL fornece a expressão CASE exatamente para isso.
CASE permite retornar valores diferentes com base em condições, diretamente dentro de um SELECT. Pense nisso como a versão do SQL de uma cadeia de condições.
SELECT name,
CASE WHEN price > 100 THEN 'expensive'
ELSE 'affordable'
END AS price_band
FROM products;Anatomia de CASE
Uma expressão CASE tem algumas partes:
WHEN condition THEN value— um ou mais ramosELSE value— uma alternativa opcionalEND— encerra a expressão (obrigatório!)
O SQL avalia os ramos WHEN de cima para baixo e retorna o valor do primeiro que for verdadeiro.
CASE WHEN condition1 THEN result1
WHEN condition2 THEN result2
ELSE default_result
ENDCASE retorna um valor
A ideia principal: uma expressão CASE é avaliada como um único valor por linha. Como produz um valor, você pode usá-la em qualquer lugar onde um valor seja permitido — na lista de SELECT, em WHERE, em ORDER BY e até mesmo dentro de funções.
Aqui, ela atribui a cada pedido um estado simples.
SELECT order_id,
CASE WHEN shipped_at IS NOT NULL THEN 'shipped'
WHEN paid_at IS NOT NULL THEN 'paid'
ELSE 'pending'
END AS status
FROM orders;A primeira correspondência vence
A ordem importa. O SQL verifica cada WHEN em sequência e para no primeiro que for verdadeiro. Os ramos posteriores são ignorados, mesmo que também correspondessem.
Abaixo, um pedido acima de 1000 é 'grande', nunca 'médio', porque o primeiro ramo correspondente vence.
SELECT order_id, total,
CASE WHEN total >= 1000 THEN 'large'
WHEN total >= 100 THEN 'medium'
ELSE 'small'
END AS size_band
FROM orders;O ramo ELSE
O ramo ELSE é o caso geral. Se nenhuma das condições WHEN for verdadeira, CASE retorna o valor de ELSE.
Se você omitir ELSE e nada corresponder, CASE retornará NULL. Essa é uma fonte comum de valores NULL inesperados, portanto, adicione um ELSE explícito quando quiser uma alternativa definida.
SELECT name,
CASE WHEN stock = 0 THEN 'out of stock' END AS note
FROM products;
-- rows with stock > 0 get NULL in note (no ELSE)As condições podem ser variadas
Uma condição WHEN é apenas uma expressão booleana — do mesmo tipo que você escreve em uma cláusula WHERE. Você pode usar comparações, AND, OR, BETWEEN, IN, LIKE e muito mais.
SELECT email,
CASE WHEN country IN ('US','CA') AND age >= 18 THEN 'eligible'
WHEN email LIKE '%@test.com' THEN 'test account'
ELSE 'review'
END AS segment
FROM users;Os tipos de resultado devem ser compatíveis
Cada ramo de um CASE deve retornar valores de um tipo compatível, pois a coluna precisa ter um único tipo. Misturar texto e números causará um erro ou uma conversão inesperada.
Se precisar de números em um ramo e texto em outro, faça a conversão explicitamente para alinhar os tipos.
SELECT product_id,
CASE WHEN on_sale THEN price * 0.9
ELSE price
END AS effective_price -- all branches numeric: good
FROM products;Usando CASE em WHERE
Como CASE produz um valor, você pode comparar seu resultado dentro de uma cláusula WHERE. Isso é útil para regras de filtragem dinâmicas.
Frequentemente, porém, a lógica booleana simples em WHERE é mais clara — use CASE em WHERE apenas quando a ramificação realmente simplificar a condição.
SELECT *
FROM orders
WHERE CASE WHEN priority = 'high' THEN total > 0
ELSE total > 500
END;Aninhando CASE
Você pode colocar um CASE dentro de outro ramo de CASE para expressar uma lógica em camadas. Isso funciona, mas expressões profundamente aninhadas ficam difíceis de ler.
Mantenha o aninhamento superficial; se ele crescer, uma coluna separada ou uma tabela de consulta geralmente será mais clara.
SELECT order_id,
CASE WHEN region = 'EU' THEN
CASE WHEN total > 100 THEN 'EU big'
ELSE 'EU small' END
ELSE 'other'
END AS bucket
FROM orders;CASE com agregações
Um padrão poderoso: envolva um CASE em uma função de agregação como SUM ou COUNT. Isso conta ou soma linhas condicionalmente em uma única passagem — às vezes chamado de agregação condicional ou tabela dinâmica.
SELECT
COUNT(*) AS total_orders,
SUM(CASE WHEN status = 'shipped' THEN 1 ELSE 0 END) AS shipped,
SUM(CASE WHEN status = 'pending' THEN 1 ELSE 0 END) AS pending
FROM orders;CASE retornando NULL de propósito
Retornar NULL de um ramo às vezes é exatamente o que você deseja — por exemplo, para ocultar um valor que não quer exibir ou para alimentar uma agregação posterior que ignore valores NULL.
Aqui, apenas os pedidos grandes mantêm seu total; os demais se tornam NULL para que AVG os ignore.
SELECT order_id,
CASE WHEN total >= 1000 THEN total
ELSE NULL
END AS large_order_total
FROM orders;Verificação rápida
Considere esta expressão para uma linha em que total = 1500:
CASE WHEN total >= 100 THEN 'medium' WHEN total >= 1000 THEN 'large' ELSE 'small' END
Qual valor ela retorna?
Recapitulação: a expressão CASE
Você aprendeu os fundamentos da lógica condicional em SQL:
CASE WHEN ... THEN ... ELSE ... ENDretorna um valor por linha- Os ramos são verificados de cima para baixo; a primeira correspondência prevalece
- Omitir
ELSEproduzNULLquando nada corresponde - Todos os ramos devem retornar tipos compatíveis
CASEfunciona emSELECT,WHEREe dentro de funções de agregação
Em seguida, compararemos as duas formas sintáticas de CASE.
SELECT name,
CASE WHEN price > 100 THEN 'expensive'
WHEN price > 20 THEN 'mid'
ELSE 'cheap'
END AS tier
FROM products;Perguntas Frequentes
A aula “A expressão CASE” é grátis?
Sim — o texto completo de “A expressão CASE” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de SQL Academy, atualize para CoddyKit PRO. O curso de SQL Academy inclui 4 aulas no total.
O que vou aprender em “A expressão CASE”?
Lógica IF/THEN dentro de uma consulta. Você pratica SQL Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar SQL Academy?
Nenhuma experiência prévia é necessária. SQL Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.
Quanto tempo leva a aula “A expressão CASE”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de SQL Academy?
Sim. Cada aula de SQL Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- A expressão CASE
- CASE pesquisado versus simples
- Agrupando e rotulando dados
- CASE em ORDER BY e agregações