0Pricing
SQL Academy · Aula

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 ramos
  • ELSE value — uma alternativa opcional
  • END — 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
END

CASE 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 ... END retorna um valor por linha
  • Os ramos são verificados de cima para baixo; a primeira correspondência prevalece
  • Omitir ELSE produz NULL quando nada corresponde
  • Todos os ramos devem retornar tipos compatíveis
  • CASE funciona em SELECT, WHERE e 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

  1. A expressão CASE
  2. CASE pesquisado versus simples
  3. Agrupando e rotulando dados
  4. CASE em ORDER BY e agregações
← Voltar para SQL Academy