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:
- O que é o comando SQL CASE?
- Qual a sintaxe do comando SQL CASE?
- Criando a tabela e inserindo os dados
- 6 exemplos de uso do comando SQL CASE
- Boas práticas ao usar o comando SQL CASE
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:
idProduto | nomeProduto | precoProduto | quantidadeProduto |
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 |
Antes de tudo, para criar a tabela “produtos” que foi mostrada acima no nosso banco de dados, usaremos o comando a seguir:
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);
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:
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:
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:
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:
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:
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;
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!