Voltar para a lista de artigos Artigos
10 minutos de leitura

O que é CASO em SQL?

SQL CASE é uma expressão muito útil que fornece lógica if-else às suas consultas SQL. É um tópico um pouco mais avançado, mas você precisará dele ao preparar relatórios - ele trará um valor maciço aos seus projetos pessoais e profissionais.

A instrução SQL CASE é uma ferramenta de fluxo de controle que permite adicionar lógica if-else a uma consulta. De modo geral, você pode usar a declaração CASE em qualquer lugar que permita uma expressão válida - por exemplo, com as cláusulas SELECT, WHERE, e GROUP BY.

A expressão CASE passa por cada condição e retorna um valor quando a primeira condição é atendida. Uma vez que uma condição seja verdadeira, CASE retornará o resultado declarado. Se nenhuma condição for verdadeira, ela retornará o valor na cláusula ELSE. Se não houver ELSE e nenhuma condição for verdadeira, ele retornará NULL.

Exemplo de caso SQL simples

Aqui está a sintaxe para a expressão SQL CASE:

CASE 
  		WHEN condition_1 THEN result_1
   		WHEN condition_2 THEN result_2
   		ELSE else_result
END 

Nesta sintaxe, SQL CASE combina o valor com condition_1 ou condition_2. Se for encontrada uma correspondência, a declaração retornará o resultado correspondente (result_1 se o valor corresponder a condition_1 ou result_2 se corresponder a condition_2). Se o valor não corresponder a nenhuma das condições, o else_result é retornado. A declaração ELSE é opcional e fornece uma forma de capturar valores não especificados nas declarações WHEN..THEN. Finalmente, toda declaração CASE deve terminar com a palavra-chave END.

O tipo de dado do resultado da instrução SQL CASE depende do contexto onde ela é usada. Por exemplo, se a expressão CASE for usada com cadeias CHAR, ela retorna o resultado como uma cadeia CHAR. Se a expressão CASE for usada em um contexto numérico, ela retorna o resultado como um número inteiro, decimal ou um valor real. O domínio desta poderosa ferramenta de fluxo de controle cria muitas novas oportunidades para recuperar e exibir dados de forma criativa, como mostrado neste artigo sobre a adição de lógica à sua consulta SQL com CASE.

Vamos aplicar a instrução SQL CASE a um exemplo prático. Imagine que temos uma pequena mercearia e usamos uma simples tabela de banco de dados para rastrear nosso estoque. O stock A tabela contém o item, o preço do item e a quantidade desse item atualmente em estoque.

ItemPriceQuantity
Bread1.5923
Milk2.003
Coffee3.2987
Sugar0.790
Eggs2.2053
Apples1.9917

E se quiséssemos uma descrição simples para acompanhar nossos dados e fornecer mais contexto para nossos relatórios? Isto é facilmente realizado com CASE WHEN:

SELECT Item, Price,
       CASE 
   WHEN Price < 1.00 THEN 'Below $1.00'
	   WHEN Price >= 1.00 THEN 'Greater or Equal to $1.00'
       END AS 'Price Description'
  FROM stock

Primeiro, nosso SELECT declara que queremos recuperar os dados de nossas colunas Item e Price. A seguir, nossa declaração CASE. Quando o Price está abaixo de 1,00, devolvemos a string 'Abaixo de $1,00'. Quando o Price for maior ou igual a 1,00, queremos retornar a string, 'Maior ou igual a $1,00'. Isto é aplicado a cada valor Price em nossa tabela.

Especificamos também que os valores retornados pela declaração CASE WHEN devem estar em uma coluna chamada Descrição do Preço:

ItemPricePrice Description
Brea1.59Greater or Equal to $1.00
Milk2.00Greater or Equal to $1.00
Coffee3.29Greater or Equal to $1.00
Sugar0.79Below $1.00
Eggs2.20Greater or Equal to $1.00
Apples1.99Greater or Equal to $1.00

Aí o temos! Para cada linha onde o Price estiver abaixo de 1,00, a string 'Abaixo de $1,00' é retornada. Para Price valores maiores ou iguais a 1,00, a string 'Maior ou Igual a $1,00' é retornada. Os resultados são mostrados na coluna Descrição do Preço.

Caso SQL quando com ELSE

Se você estiver usando ELSE, esta declaração deve vir após cada condição CASE WHEN que você especificou. Suponha que agora queremos categorizar os diferentes preços em nossa tabela em 3 categorias diferentes:

  • Itens abaixo de US$ 1,00.
  • Itens entre US$1,00 e US$3,00.
  • Itens acima de $3,00.

Usaremos a declaração ELSE para lidar com valores Price acima de 3,00:

SELECT Item, Price,
       CASE WHEN Price < 1.00 THEN 'Below $1.00'
	   WHEN Price >= 1.00 AND Price <= 3.00 THEN 'Between $1.00 and $3.00'
	   ELSE 'Above $3.00' 
       END AS 'Price Description'
  FROM stock

O Price de cada linha é verificado para ver se é igual ou inferior a 1,00 ou entre 1,00 e 3,00. Se ela se enquadrar em uma destas categorias, a cadeia correspondente é devolvida. Se Price não for inferior a 3,00, a declaração ELSE é alcançada. Nossa declaração ELSE retorna a string, 'Above $3.00'.

É por isso que a ordenação de suas declarações é importante. SQL avalia cada CASE em ordem, finalmente alcançando o ELSE se nenhuma condição for atendida.

ItemPricePrice Description
Bread1.59Between $1.00 and $3.00
Milk2.00Between $1.00 and $3.00
Coffee3.29Above $3.00
Sugar0.79Below $1.00
Eggs2.20Between $1.00 and $3.00
Apples1.99Between $1.00 and $3.00

Usando múltiplos casos

A principal razão pela qual alguém pode escolher usar a declaração SQL CASE é que deseja avaliar várias condições. Eles querem realizar uma série de verificações e transformar os resultados em dados significativos, geralmente na forma de um relatório.

Digamos que queremos gerar um relatório simples para nosso stock mesa. Ela nos dirá se o nível de estoque é alto, médio, baixo ou totalmente fora de estoque! Isto pode ser facilmente alcançado utilizando CASE:

SELECT Item,
      CASE WHEN Quantity > 0 AND Quantity <= 20 THEN 'Low'
            WHEN Quantity > 20 AND Quantity <= 50 THEN 'Medium'
            WHEN Quantity > 50 THEN 'High'
            ELSE 'Out Of Stock' 
		END AS 'Stock Level'
  	FROM stock

Este é o nosso exemplo mais complexo até agora. Vamos quebrar esta consulta SQL.

Nosso resultado terá duas colunas. A primeira coluna é Item, com a qual estamos selecionando explicitamente:

SELECT Item

A segunda coluna é a coluna de resultados gerada por nossas expressões SQL CASE WHEN, a qual estamos chamando de Nível de Estoque:

END AS 'Stock Level'

Agora vamos quebrar cada condição, na ordem em que SQL as avaliaria.

Primeiro, SQL verifica se o Quantity é maior que zero e menor que ou igual a 20.

	CASE WHEN Quantity > 0 AND Quantity <= 20 THEN 'Low'

Se isto for verdade, 'Low' é retornado e a próxima linha começa a ser avaliada.

Se o resultado for falso, o avaliador olha para a próxima declaração CASE:

WHEN Quantity > 20 AND Quantity <= 50 THEN 'Medium'

Quantity é verificado novamente para ver se o valor é maior que 20 e menor ou igual a 50, retornando a string 'Médio' se este for o caso. Se esta condição não for cumprida, a condição seguinte é verificada:

WHEN Quantity > 50 THEN 'High'

A declaração final CASE verifica se o Quantity é maior que 50, retornando a string 'Alta' se for o caso.

Há uma outra situação não coberta por nossas diferentes declarações CASE. E se o Quantity de um determinado Item for 0? Veja nossas declarações CASE de novo, particularmente:

		CASE WHEN Quantity > 0 AND Quantity <= 20 THEN 'Low'
		

Verificamos que Quantity é maior que 0, ou seja, se for igual a 0, esta condição seria avaliada como falsa e o banco de dados continuaria a verificar as outras declarações do CASE. Por este motivo, incluímos a declaração ELSE em nossa consulta SQL:

ELSE 'Out Of Stock' 

Isto atende exatamente a este cenário. Se o Quantity de um Item for 0, o avaliador SQL chegará à nossa declaração ELSE e retornará 'Out of Stock'.

A execução desta consulta produz o seguinte resultado:

ItemStock Level
BreadMedium
MilkLow
CoffeeHigh
SugarOut Of Stock
EggsHigh
ApplesLow

Podemos ver que o açúcar tem um Quantity de 0, o que faz com que ele se mostre como 'Esgotado'. Compare os outros valores de Quantity em nosso stock com a tabela Stock Level mostrada para garantir que você entenda como funcionam nossas declarações CASE.

Imagine como este relatório seria útil se houvesse centenas de itens. Um relatório como este poderia ser enviado aos gerentes de compras diariamente, permitindo-lhes manter os níveis de estoque de itens populares.

Caso com valores NULL

Ao utilizar CASE, você pode notar valores NULL indesejados em seu conjunto de resultados. Por que esses valores aparecem e que ações você pode tomar para removê-los? Os valores NULL aparecem quando um valor não corresponde a nenhuma das declarações CASE ou ELSE que você declara. Vejamos um exemplo prático que mostra como o NULL pode ser devolvido.

Imagine que excluímos a declaração ELSE de nosso exemplo anterior. Como isso afetaria nossos resultados? Vejamos a consulta anterior, desta vez sem a declaração ELSE:

SELECT Item,
      CASE WHEN Quantity > 0 AND Quantity <= 20 THEN 'Low'
            WHEN Quantity > 20 AND Quantity <= 50 THEN 'Medium'
            WHEN Quantity > 50 THEN 'High'
		END AS 'Stock Level'
  	FROM stock

Os resultados ficariam assim. Preste atenção especial ao nível de estoque de açúcar:

ItemStock Level
BreadMedium
MilkLow
CoffeeHigh
SugarNULL
EggsHigh
ApplesLow

Sem ELSE para lidar com a situação de Quantity sendo zero, nossa consulta retorna um NULL.

Se você tem um valor NULL indesejado em seus resultados CASE WHEN, você pode ter um cenário que não é coberto por suas condições CASE WHEN e ELSE.

GROUP BY CASO

Como mencionado anteriormente, você pode usar a expressão SQL CASE com GROUP BY. Vamos examinar um exemplo prático disso.

Imagine que quiséssemos agrupar itens com base em seu preço e ao mesmo tempo exibir o preço mínimo e máximo para os grupos de baixo e alto custo. Isto requer o uso das funções agregadas MIN() e MAX(). A declaração GROUP BY é freqüentemente usada para agrupar os dados resultantes por uma ou mais colunas, e muitas vezes especificamente com funções agregadas. Aqui está um exemplo de como GROUP BY é usado juntamente com funções agregadas que você pode ler para obter mais informações. Vamos quebrar a consulta SQL abaixo para mostrar como nosso conjunto de resultados desejado pode ser alcançado:

SELECT
CASE WHEN Price >= 2.00 THEN 'High Price Item'
WHEN Price > 0 AND Price < 2.00 THEN 'Low Price Item'
END AS PriceLevel,
Min(Price) as MinimumPrice,
Max(Price) as MaximumPrice

FROM stock
GROUP BY
CASE WHEN Price >= 2.00 THEN 'High Price Item'
WHEN Price > 0 AND Price < 2.00 THEN 'Low Price Item'

END

Primeiro, vamos analisar a declaração CASE. Ela é semelhante ao exemplo anterior.

CASE WHEN Price >= 2.00 THEN 'High Price Item'
WHEN Price > 0 AND Price < 2.00 THEN 'Low Price Item'
END AS PriceLevel

Se o Price for maior ou igual a 2,00, o item é classificado como um item de alto preço. Se o Price for maior que 0 mas menor que 2,00, o item é um item de baixo preço. Estes valores de cadeia são então armazenados e exibidos na coluna PriceLevel, como especificado pelo pseudônimo END AS.

Usamos as funções agregadas de MIN() e MAX() em nossa coluna Price. Isto obtém o menor e o maior Price dos itens em nossa tabela.

Usamos nossa cláusula GROUP BY para aplicar estas funções agregadas a nossas duas categorias de níveis de preços altos e baixos. (Não se preocupe se isto parecer complicado; dominar GROUP BY requer muita prática. Confira nossa faixa Trilha de Práticas em SQL para exercícios interativos que aperfeiçoam sua técnica GROUP BY e outras habilidades SQL).

A execução desta consulta SQL retorna o seguinte conjunto de resultados:

PriceLevelMinimumPriceMaximumPrice
High Price Item2.003.29
Low Price Item0.791.99

Estes são exatamente os resultados que queríamos! Agora podemos ver claramente o preço mínimo e máximo de cada uma das categorias de item definidas em nossa instrução SQL CASE WHEN. Consulte nossa stock tabela e anote quais itens individuais se ligam aos valores mostrados para MinimumPrice e MaximumPrice. Se tivéssemos que adicionar um novo item ao nosso stock tabela que custa US$ 4,00, você verá o MaximumPrice do "Item de Preço Elevado" aumentar para 4,00.

CASO SQL e Consultas Completas Reutilizáveis

A utilização do SQL CASE lhe permitirá escrever consultas complexas que executam uma série de ações. Acabamos de lhe mostrar como usar CASE WHEN com SELECT. Como mostrado por este artigo sobre o uso do CASE com declarações modificadoras de dados, o caso CASE WHEN também será usado com INSERT, UPDATE, e DELETE. Isto resulta em consultas altamente reutilizáveis que podem ser implementadas para relatórios ou aplicações. Se você estiver interessado em aprender como construir relatórios personalizados de alto valor, recomendo o abrangente curso LearnSQL.com.br sobre criação de relatórios SQL.