CodeGym /Cursos /SQL SELF /Expressões condicionais: CASE <expressão> WHEN ... THEN ...

Expressões condicionais: CASE <expressão> WHEN ... THEN ... ELSE ... END

SQL SELF
Nível 10, Lição 1
Disponível

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 valores valor1, valor2 etc.
  • THEN mostra 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 → recebe NULL se nenhum valor bater.
  • Compara com NULL → não funciona, usa IS NULL e o CASE de busca.
  • Compara tipos incompatíveis → tipo CASE grade WHEN '5' se grade é 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.

2
Tarefa
SQL SELF, nível 10, lição 1
Bloqueado
Atribuição de descrições textuais às notas
Atribuição de descrições textuais às notas
2
Tarefa
SQL SELF, nível 10, lição 1
Bloqueado
Comparando categorias de produtos
Comparando categorias de produtos
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION