Olá humanos,
Nesse post vamos falar sobre o comando CASE e suas variações com vários exemplos. #gogogo
Comando CASE:
Em primeiro lugar, o comando CASE avalia uma lista de condições e retorna uma das várias expressões de resultado possíveis.
O comando ELSE é OPCIONAL.
O comando CASE pode ser usado em qualquer instrução ou cláusula que permita uma expressão válida. Por exemplo: SELECT, UPDATE, DELETE e SET, e em cláusulas, como WHERE, ORDER BY e HAVING.
SINTAXE:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
-- Syntax for SQL Server, Azure SQL Database and Azure Synapse Analytics --Simple CASE expression: CASE input_expression WHEN when_expression THEN result_expression [ ...n ] [ ELSE else_result_expression ] END --Searched CASE expression: CASE WHEN Boolean_expression THEN result_expression [ ...n ] [ ELSE else_result_expression ] END |
https://docs.microsoft.com/pt-br/sql/t-sql/language-elements/case-transact-sql?view=sql-server-ver15
Agora vamos criar a tabela “Pedido” que será utilizada nos próximos exemplos.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
USE Treinamento_TSQL CREATE TABLE Pedido ( NumPedido INT IDENTITY(1,1), NomeCliente VARCHAR(100), DataPedido DATETIME, ValorPedido NUMERIC(9,2), FlSituacao CHAR(1) ) /* FlSituacao: P - Pendente A - Aprovado C - Cancelado E - Enviado F - Finalizado */ INSERT INTO Pedido VALUES ('Luiz Vitor', '20220220', 2500.00, 'P'), ('Gustavo Larocca', '20220315', 2500.00, 'A'), ('Fabricio Lima', '20220118', 3500.00, 'C'), ('Eduardo Roedel', '20220320', 5000.00, 'E'), ('Fabiano Amorim', '20210609', 10000.00, 'F'), ('Thiago Alencar', '20220325', 50.00, 'P'), ('Dirceu Resende', '20191030', 100.00, '?'), ('Raiane Lins', '20220315', 7500.00, 'A') SELECT * FROM Pedido |
Segue abaixo a tabela que foi criada.
Exemplo 1 – CASE simples:
Esse é o exemplo MAIS SIMPLES, utilizamos o CASE na coluna “FlSituacao”. Repare que no caso do cliente “Dirceu Resende” o valor original da coluna é “?”, mas não temos nenhuma opção no CASE com ela. Como NÃO utilizamos o comando ELSE, o valor dessa linha retorna NULL.
O CASE vai validar cada uma das opções seguindo a ordem de cima para baixo e irá retornar o primeiro que fizer a correspondência do valor com a coluna “FlSituacao”. Por exemplo, se ele já for igual na primeira opção, ele irá retornar o resultado e não irá validar as demais opções.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
-- CASE 1 - CASE SIMPLES SELECT NumPedido, NomeCliente, DataPedido, ValorPedido, CASE FlSituacao WHEN 'P' THEN 'Pendente' WHEN 'A' THEN 'Aprovado' WHEN 'C' THEN 'Cancelado' WHEN 'E' THEN 'Enviado' WHEN 'F' THEN 'Finalizado' END AS Situacao FROM Pedido |
Exemplo 2 – CASE com ELSE – Tratando NULL:
Nesse exemplo inclui o comando ELSE no CASE. Dessa forma, quando não existir uma opção com o valor correspondente, iremos retornar sempre o valor do ELSE, que nesse caso será “Desconhecido”. Repare que a “Situacao” do cliente “Dirceu Resende” não veio mais com o valor NULL.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
-- CASE 2 - COM ELSE - TRATANDO NULL SELECT NumPedido, NomeCliente, DataPedido, ValorPedido, CASE FlSituacao WHEN 'P' THEN 'Pendente' WHEN 'A' THEN 'Aprovado' WHEN 'C' THEN 'Cancelado' WHEN 'E' THEN 'Enviado' WHEN 'F' THEN 'Finalizado' ELSE 'Desconhecido' END AS Situacao FROM Pedido |
Exemplo 3 – CASE com expressão simples:
Agora vamos ver um exemplo utilizando uma expressão. Nesse caso, estamos apenas comparando a coluna “FlSituacao” com alguns valores específicos. Repare que dessa vez tivemos que repetir a coluna em cada uma das opções após o comando WHEN (nos exemplos anteriores utilizamos a coluna apenas uma vez logo após o comando CASE).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
-- CASE 3 - COM EXPRESSAO SIMPLES SELECT NumPedido, NomeCliente, DataPedido, ValorPedido, CASE WHEN FlSituacao = 'P' THEN 'Pendente' WHEN FlSituacao = 'A' THEN 'Aprovado' WHEN FlSituacao = 'C' THEN 'Cancelado' WHEN FlSituacao = 'E' THEN 'Enviado' WHEN FlSituacao = 'F' THEN 'Finalizado' ELSE 'Desconhecido' END AS Situacao FROM Pedido |
Exemplo 4 – CASE com mais expressões:
Por fim, nesse exemplo mostro que podemos utilizar mais de uma expressão em cada uma das opções. Repare no print que agora temos duas opções para as situações “Pendente” (seta vermelha) e “Aprovado” (seta verde).
IMPORTANTE: Cuidado para não utilizar várias expressões e deixar a query muito complexa. Já vi alguns casos que o CASE ficou bem grande e dificultava demais o entendimento. Seja simples xD.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
-- CASE 4 - COM MAIS EXPRESSOES SELECT NumPedido, NomeCliente, DataPedido, ValorPedido, CASE WHEN FlSituacao = 'P' AND (DATEDIFF(DAY, DataPedido, GETDATE()) > 10) THEN 'Pendente - Mais de 10 dias' WHEN FlSituacao = 'P' THEN 'Pendente' WHEN FlSituacao = 'A' AND ValorPedido < 5000.00 THEN 'Aprovado - Menor que 5 mil reais' WHEN FlSituacao = 'A' AND ValorPedido >= 5000.00 THEN 'Aprovado - Maior ou igual a 5 mil reais' WHEN FlSituacao = 'C' THEN 'Cancelado' WHEN FlSituacao = 'E' THEN 'Enviado' WHEN FlSituacao = 'F' THEN 'Finalizado' ELSE 'Desconhecido' END AS Situacao FROM Pedido |
Espero que tenha gostado e que isso também possa ser útil no seu dia a dia. Até o próximo post!
Me siga no LinkedIn e YouTube para ficar por dentro das novidades.
Abraço,
Luiz Vitor França Lima
Consultor SQL Server