Se você já conhece o CASE, sabe como colocar lógica direto na query. Mas nem todo mundo sabe que o CASE tem duas formas. Se o CASE WHEN ... é tipo um if-else, o CASE simples é igual ao switch-case de outras linguagens: ele compara uma expressão com vários valores e executa o bloco correspondente.
Fica mais compacto e intuitivo quando você compara um campo com valores fixos.
Sintaxe do CASE simples
CASE expressão
WHEN valor1 THEN resultado1
WHEN valor2 THEN resultado2
...
ELSE resultado_padrao
END
É bem simples:
expressão— é a expressão ou campo que vai ser comparado com os valoresvalor1,valor2etc.THENmostra o que retornar se bater.ELSE— o que retornar se nada bater (pode deixar de fora, mas melhor não).
Exemplo: Notas dos estudantes
Imagina uma tabela students com a coluna grade, que tem um número inteiro de 2 a 5. Queremos mostrar a nota em texto.
SELECT
name,
grade,
CASE grade
WHEN 5 THEN 'Excelente'
WHEN 4 THEN 'Bom'
WHEN 3 THEN 'Satisfatório'
WHEN 2 THEN 'Insatisfatório'
ELSE 'Desconhecido'
END AS nota_em_palavras
FROM students;
Aqui o CASE compara o valor do campo grade com os valores fixos 2, 3, 4, 5.
Exemplo: Categorias de produtos pelo código
Na tabela products tem o campo category_code, que guarda etiquetas curtas: 'el', 'frn', 'bks' etc. Queremos mostrar o nome legível da categoria.
SELECT
product_name,
category_code,
CASE category_code
WHEN 'el' THEN 'Eletrônicos'
WHEN 'frn' THEN 'Móveis'
WHEN 'bks' THEN 'Livros'
ELSE 'Outros'
END AS category_name
FROM products;
Esse truque é ótimo quando você quer mostrar texto "humano" no lugar do código.
Exemplo: Nomes dos meses
Às vezes você quer mostrar o nome do mês em texto pelo número:
SELECT
EXTRACT(MONTH FROM order_date) AS numero_mes,
CASE EXTRACT(MONTH FROM order_date)
WHEN 1 THEN 'Janeiro'
WHEN 2 THEN 'Fevereiro'
WHEN 3 THEN 'Março'
WHEN 4 THEN 'Abril'
WHEN 5 THEN 'Maio'
WHEN 6 THEN 'Junho'
WHEN 7 THEN 'Julho'
WHEN 8 THEN 'Agosto'
WHEN 9 THEN 'Setembro'
WHEN 10 THEN 'Outubro'
WHEN 11 THEN 'Novembro'
WHEN 12 THEN 'Dezembro'
ELSE 'Desconhecido'
END AS nome_mes
FROM orders;
Aqui o CASE simples deixa claro o que seriam só números de 1 a 12.
Trabalhando com NULL no CASE simples
Importante entender que se o valor for comparado com NULL, o resultado vai ser NULL, porque NULL = NULL — isso não é verdade, é desconhecido.
Exemplo com NULL:
SELECT
user_id,
status,
CASE status
WHEN 'active' THEN 'Ativo'
WHEN 'blocked' THEN 'Bloqueado'
WHEN NULL THEN 'Sem status' -- não vai funcionar!
ELSE 'Desconhecido'
END AS estado_usuario
FROM users;
Ao invés de WHEN NULL usa o ELSE, ou só aplica o CASE de busca (que vimos na aula passada):
CASE
WHEN status IS NULL THEN 'Sem status'
...
Comparação com o CASE de busca
| Característica | CASE simples | CASE de busca |
|---|---|---|
| Comparação com valores específicos | ✅ Prático | ❌ Não serve |
| Flexibilidade de condições (>, IS NULL) | ❌ Não dá | ✅ Dá |
| Analogia em programação | switch-case |
if-else |
Casos práticos
Exemplo: Visualização do status da solicitação
| request_id | status |
|---|---|
| 101 | new |
| 102 | in_progress |
| 103 | done |
| 104 | cancelled |
| 105 | NULL |
SELECT
request_id,
CASE status
WHEN 'new' THEN '🟡 Nova'
WHEN 'in_progress' THEN '🔵 Em andamento'
WHEN 'done' THEN '🟢 Finalizada'
ELSE '⚪ Desconhecido'
END AS status_label
FROM requests;
| request_id | status_label |
|---|---|
| 101 | 🟡 Nova |
| 102 | 🔵 Em andamento |
| 103 | 🟢 Finalizada |
| 104 | ⚪ Desconhecido |
| 105 | ⚪ Desconhecido |
Aqui o CASE funciona como tradutor: transforma status técnicos em rótulos claros (e até fofos). E se o status for desconhecido ou NULL — o usuário vê ⚪ “Desconhecido”.
Exemplo: Agrupamento por categorias para relatório
| employee_id | name | department |
|---|---|---|
| 1 | Alex Lin | HR |
| 2 | Maria Chi | IT |
| 3 | Anna Song | IT |
| 4 | Otto Art | FIN |
| 5 | Jane Doe | HR |
| 6 | Max Gray | SALES |
| 7 | Zoe Black | IT |
| 8 | Tom Brown | FIN |
| 9 | Liam Park | NULL |
| 10 | Eva Gold | HR |
SELECT
CASE department
WHEN 'HR' THEN 'Recursos Humanos'
WHEN 'IT' THEN 'Tecnologia'
WHEN 'FIN' THEN 'Finanças'
ELSE 'Outros'
END AS nome_departamento,
COUNT(*) AS quantidade_funcionarios
FROM employees
GROUP BY
CASE department
WHEN 'HR' THEN 'Recursos Humanos'
WHEN 'IT' THEN 'Tecnologia'
WHEN 'FIN' THEN 'Finanças'
ELSE 'Outros'
END;
Resultado:
| nome_departamento | quantidade_funcionarios |
|---|---|
| Recursos Humanos | 3 |
| Tecnologia | 3 |
| Finanças | 2 |
| Outros | 2 |
O que rola aqui:
- Funcionários do departamento HR vão pra categoria Recursos Humanos.
- IT vira Tecnologia.
- FIN vira Finanças.
- Todo o resto, incluindo SALES e NULL, cai em Outros. Esse jeito é ótimo pra criar relatórios amigáveis e claros.
Erros comuns
- Esqueceu o
ELSE→ recebeNULLse nenhum valor bater. - Compara com
NULL→ não funciona, usaIS NULLe oCASEde busca. - Compara tipos incompatíveis → tipo
CASE grade WHEN '5'segradeé numérico.
O CASE simples é sua ferramenta quando precisa comparar um valor com várias opções. Ele é compacto, fácil de ler e muito útil pra classificação de texto, visualização, conversão de códigos e agrupamento prático.
Se você precisa checar intervalos, NULL ou condições mais complexas — usa o CASE de busca. SQL gosta de clareza. E o CASE é seu jeito de deixar tudo claro.
GO TO FULL VERSION