SQL CASE: avaliando listas de condições e retornando resultados!

O comando SQL CASE é uma cláusula muito importante da linguagem SQL, pois ele permite a criação de estruturas de controle complexas para testar condições, reduzindo a necessidade de gastar várias linhas de código fora do comando para fazer esse tipo de verificação.

Apesar disso, muitos iniciantes na área da programação sentem dificuldade em aplicá-lo, já que uma pequena falha na lógica definida pelas condições do CASE pode gerar resultados completamente diferentes do desejado.

Por isso, entender como esse comando funciona e em quais situações ele pode ser aplicado é essencial para evitar construir queries erradas ou inserir erros no banco. 

Para ajudar com isso, neste post vamos mostrar:

Fique com a gente e tenha uma boa leitura!

O que é o comando SQL CASE?

A expressão SQL CASE é um comando usado para definir condições que vão ser testadas durante a execução do código e, caso sejam atendidas, entregarão um determinado resultado.

Além disso, o CASE pode ser usado junto com qualquer instrução ou cláusula que permita avaliar expressões, como os comandos UPDATE, SELECT e DELETE e as cláusulas WHERE, ORDER BY, GROUP BY, entre outros.

Qual a sintaxe do comando SQL CASE?

A sintaxe básica do comando SQL CASE é muito simples, como mostramos a seguir:

 CASE
     WHEN condição1 THEN resultado1
     WHEN condição2 THEN resultado2
     WHEN condiçãoN THEN resultadoN
     ELSE resultado
 END; 

Como é possível notar, a expressão WHEN define a condição que deverá ser testada pelo comando, já  a expressão THEN indica o resultado que será obtido caso a condição seja cumprida. Caso nenhuma condição seja atendida, então o resultado será aquele indicado pela cláusula ELSE.

Por fim, o END determina o fechamento da expressão CASE. É interessante lembrar que, em alguns comandos, usamos a expressão AS junto com o END. Dessa forma:

END AS pseudônimo

Isso ocorre quando queremos definir um pseudônimo para a coluna em que os resultados da CASE vão ser mostrados. Mais à frente, mostraremos alguns exemplos nos quais será possível ver como isso funciona, ok?

Criando a tabela e inserindo os dados

Até aqui mostramos para que serve o comando SQL CASE. Então, para dar sequência à explicação, nos próximos tópicos iremos mostrar alguns exemplos práticos de uso dessa instrução. Para eles, usaremos como base de dados uma tabela simples de produtos, que mostramos abaixo:

idProdutonomeProdutoprecoProdutoquantidadeProduto
1água mineral4.98120
2margarina5.98100
3pão de forma5.9850
4vinagre7.9975
5sabão em pó7.50108
6detergente3.9890
7vinho tinto189.9030
8macarrão espaguete7.90145
9molho de tomate2.99130
10arroz integral7.4845
11arroz branco23.90170
Tabela 1. Tabela produtos

Antes de tudo, para criar a tabela “produtos” que foi mostrada acima no nosso banco de dados, usaremos o comando a seguir:

criando a tabela produtos
criação da tabela produtos
Figura 1. Criação da tabela produtos

Sucesso, nossa tabela foi criada no banco! Agora, vamos inserir os dados que serão usados para os exemplos, conforme mostramos no comando abaixo:

 INSERT INTO produtos(
 idProduto,
 nomeProduto,
 precoProduto,
 quantidadeProduto) 
 VALUES 
 (1, 'água mineral', 4.98, 120),
 (2, 'margarina', 5.98, 100),
 (3, 'pão de forma', 5.98, 50),
 (4, 'vinagre', 7.99, 75),
 (5, 'sabão em pó', 7.50, 108),
 (6, 'detergente', 3.98, 90),
 (7, 'vinho tinto', 189.90, 30),
 (8, 'macarrão espaguete', 7.90, 145),
 (9, 'molho de tomate', 2.99, 130),
 (10, 'arroz integral', 7.48, 45),
 (11, 'arroz branco', 23.90, 170); 
Inserção de dados na tabela de produtos
Figura 2. Inserção de dados na tabela produtos

Tudo pronto! Com nossa tabela finalizada, já podemos seguir para a demonstração dos exemplos.

6 exemplos de uso do comando SQL CASE

1. Usando uma expressão CASE com WHEN e ELSE

Para esse primeiro exemplo, iremos usar a forma simples da expressão CASE. Essa forma compara um valor com os valores definidos na expressão WHEN e então retorna um resultado caso eles sejam compatíveis. Se o valor não for compatível com nenhuma condição dada em WHEN, então o resultado é definido pela cláusula ELSE.

Para demonstrar isso, pense em um cenário em que serão definidos descontos para determinados produtos. Assim, para itens com um determinado nome, será dado um desconto tal. Se o item não tiver nenhum dos nomes indicados, ele não terá desconto. Nesse caso, o código que poderíamos usar seria:

 SELECT nomeProduto, precoProduto,
 CASE nomeProduto
 WHEN 'margarina' THEN (precoProduto)*0.9
 WHEN 'vinagre' THEN (precoProduto)*0.8
 WHEN 'vinho tinto' THEN (precoProduto)*0.7
 ELSE 'Sem desconto disponível'
 END AS produtosComDesconto
 From produtos; 

Depois de executá-lo, temos o resultado abaixo:

Execução do SQL CASE usando When e Else
Figura 3. Execução do CASE com WHEN e ELSE

2. Usando uma expressão CASE sem o ELSE

O uso da cláusula ELSE não é obrigatório no comando CASE. Então, qual seria o resultado se retirássemos essa linha do comando usado no exemplo anterior? É o que veremos agora.

 SELECT nomeProduto, precoProduto,
 CASE nomeProduto
 WHEN 'margarina' THEN (precoProduto)*0.9
 WHEN 'vinagre' THEN (precoProduto)*0.8
 WHEN 'vinho tinto' THEN (precoProduto)*0.7
 END AS produtosComDesconto
 From produtos; 

Após executar o comando acima, temos o seguinte retorno:

Execução do CASE sem cláusula ELSE
Figura 4. Execução do CASE sem a cláusula ELSE

Observe que, sem a cláusula ELSE definida, o SQL atribuiu o valor NULL para os linhas que não atendiam a nenhuma condição especificada pela cláusula WHEN.

3. Usando uma expressão CASE de pesquisa

Agora vamos ver como funciona a forma de expressão CASE de pesquisa. Essa segunda forma é usada para avaliar um conjunto de expressões e retornar um resultado assim que uma delas for avaliada como verdadeira. Ao contrário da forma simples, a CASE de pesquisa permite que múltiplas comparações sejam definidas em uma cláusula WHEN.

Então, imagine que temos uma situação na qual precisamos definir uma taxa de desconto de acordo com o preço do produto. Para itens com preço igual ou menor a 5, o desconto será de 40%. Se o preço for menor ou igual a 10, o desconto será de 30%. Já para outros valores, o desconto será de 20%.

Nesse caso, o código que poderia ser usado seria para solucionar a questão:

 SELECT nomeProduto, precoProduto,
 CASE
 WHEN precoProduto <=5.0 THEN (precoProduto)*0.6
 WHEN precoProduto <=10.0 THEN (precoProduto)*0.7
 ELSE (precoProduto)*0.8
 END AS precoComDesconto
 FROM produtos; 

Após rodar o comando, podemos observar o seguinte resultado:

Execução SQL CASE pesquisa
Figura 5. Execução CASE de pesquisa

4. Usando uma expressão CASE com múltiplas expressões

O comando SQL CASE permite definir várias expressões para serem testadas durante a execução. No exemplo que mostraremos agora, queremos identificar os itens da tabela “produtos” que precisam de reposição. Para isso, precisamos seguir a regra:

  • produtos com quantidade menor ou igual a 100 precisam de reposição;
  • produtos com quantidade menor ou igual a 150 estão com estoque baixo;
  • produtos com quantidade menor ou igual a 200 recebem classificação de estoque médio;
  • se nenhuma condição for atendida, então o item está com estoque alto.

Nesse caso, o código que cumpre essa lógica seria:

 SELECT nomeProduto, quantidadeProduto,
 CASE
 WHEN quantidadeProduto <= 100 THEN 'Reposição'
 WHEN quantidadeProduto <= 150 THEN 'Estoque baixo'
 WHEN quantidadeProduto <= 200 THEN 'Estoque médio'
 ELSE 'Estoque alto'
 END AS estoque
 FROM produtos; 

Após executá-lo, podemos observar o resultado mostrado abaixo:

Execução SQL CASE com expressões múltiplas
Figura 6. Execução CASE com múltiplas expressões

Note que, como todos os produtos têm quantidade menor que 200, nenhum deles recebeu a classificação de “estoque alto”.

5. Usando uma expressão CASE dentro de outra CASE: Cases aninhadas

Com o comando SQL CASE também podemos testar condições dentro de outras condições. Para essa demonstração, imagine um cenário em que queremos estabelecer um novo preço para os itens da nossa tabela “produtos” de acordo com o preço e quantidade no estoque.

Então, se o preço do produto estiver entre 10 e 5 reais, deve-se avaliar se a quantidade está acima de 100. Caso as duas condições sejam verdadeiras, então o produto recebe um desconto de 40%. Se a primeira condição for verdadeira, mas a segunda não, o preço terá um desconto de 10%. Já se a primeira condição não for verdadeira, o preço permanece o mesmo.

Nesse caso, teríamos o seguinte código:

 SELECT nomeProduto, precoProduto, quantidadeProduto,
 CASE
 WHEN precoProduto <= 10.0 and precoProduto >= 5 THEN
 CASE
 WHEN quantidadeProduto > 100 THEN (precoProduto)*0.6
 ELSE (precoProduto)*0.9 END
 ELSE precoProduto
 END AS novoPreco
 FROM produtos; 

Após rodar o comando, podemos ver o resultado:

Figura 7. Execução CASE aninhada

6. Usando uma expressão CASE com SQL GROUP BY

Agora, para este último exemplo, suponha que precisamos agrupar os produtos com base na quantidade disponível de cada um. Além disso, queremos identificar qual é a maior e a menor quantidade de itens dentro de cada grupo formado. Para isso, os itens serão agrupados de acordo com a lógica:

  • menor ou igual a 100 = Estoque baixo;
  • menor ou igual a 150 = Estoque médio;
  • outros valores = Estoque alto.

Dessa forma, temos o seguinte código:

 SELECT
 CASE
 WHEN quantidadeProduto <= 100 THEN 'Estoque baixo'
 WHEN quantidadeProduto <= 150 THEN 'Estoque médio'
 ELSE 'Estoque alto'
 END AS nivelEstoque,
 Min(quantidadeProduto) as menorQuantidade,
 Max(quantidadeProduto) as maiorQuantidade
 FROM produtos
 GROUP BY
 CASE
 WHEN quantidadeProduto <= 100 THEN 'Estoque baixo'
 WHEN quantidadeProduto <= 150 THEN 'Estoque médio'
 ELSE 'Estoque alto'
 END; 

Depois de executado, podemos ver o resultado mostrado a seguir:

Execução CASE com Group BY
Figura 8. Execução CASE com GROUP BY

Boas práticas ao usar o comando SQL CASE

Um dos principais cuidados que é preciso ter ao utilizar a cláusula CASE é a forma em que as condições são definidas na expressão WHEN. Como o SQL retorna o resultado da primeira expressão que for avaliada como verdadeira, o retorno pode apresentar um resultado errado caso a lógica não tenha sido bem pensada. 

Para demonstrar isso, vamos pegar o nosso exemplo número quatro. Apenas alterando a ordem em que as condições foram definidas, mudamos completamente o resultado obtido. Observe:

 SELECT nomeProduto, quantidadeProduto,
 CASE
 WHEN quantidadeProduto <= 200 THEN 'Estoque médio'
 WHEN quantidadeProduto <= 150 THEN 'Estoque baixo'
 WHEN quantidadeProduto <= 100 THEN 'Reposição'
 ELSE 'Estoque alto'
 END AS estoque
 FROM produtos; 
Lógica errada na execução do SQL CASE
Figura 9. Execução CASE com lógica errada

Perceba que, como todos os produtos têm quantidade menor que 200, nenhuma das outras condições foi verificada durante a execução e o retorno foi o mesmo para todas as linhas. Por isso, para usar a expressão CASE é importante ter um bom domínio em lógica de programação para conseguir estruturar as condições que serão avaliadas de forma correta.

Como foi possível notar, o SQL CASE é um comando muito versátil que pode ser aplicado para testar diferentes tipos de condições, retornando um resultado específico para cada uma delas. Ele também pode ser usado em conjunto com vários outros comandos SQL, facilitando a manipulação dos dados no banco.

Gostou do post e quer continuar aprendendo? Então, confira o próximo artigo e saiba tudo sobre programação!