Voltar para a lista de artigos Artigos
10 minutos de leitura

Como utilizar o CASO em SQL

Se você precisar avaliar várias instruções condicionais, a instrução SQL CASE fará o trabalho. Aqui está o que você precisa saber para usar o CASE como um profissional.

Por que CASE é tão importante em SQL? Se você estiver analisando ou manipulando dados, muitas vezes você vai querer definir regras baseadas em certas condições, por exemplo, se o desempenho de um funcionário estiver acima da média, dê a ele um aumento de 10%; se estiver pendente, dê a ele um aumento de 15%; caso contrário, dê a ele um aumento de 5%.

Para lidar com situações onde é necessário avaliar muitas declarações condicionais em conjunto e retornar resultados dependendo de qual declaração é verdadeira, a SQL oferece a declaração CASE.

A instrução SQL CASE é uma das construções condicionais mais úteis disponíveis e tem muitas aplicações para análise de dados com SQL.

Para praticar usando a declaração CASE após a leitura deste artigo, recomendo nosso curso interativo Como Criar Relatórios Básicos em SQL. Ele contém quase 100 exercícios e está focado no uso de CASE em diferentes problemas práticos de SQL.

O que é a declaração CASE?

Em SQL, a instrução CASE retorna resultados baseados na avaliação de certas condições. Ela é bastante versátil e pode ser usada em diferentes construções. Por exemplo, você pode usá-la para exibir valores, ordenar resultados de classificação ou filtrar registros. Ela avalia as condições declaradas e retorna o resultado para a primeira declaração que avalia como verdadeira.

Antes de entrar em detalhes sobre como CASE funciona, dê uma olhada na sintaxe da declaração CASE:

CASE
WHEN <condition> THEN <value>,
WHEN <other condition> THEN <value>
ELSE <value>
END AS <column name>

Vejamos um exemplo prático de uma simples declaração CASE.

Aqui está o order_summary mesa:

order_idcustomer_idcustomer_namequantityorder_valueshipping_fee
A1231221Emily52059
A1243213Javier223000
A1253213Javier12320000
A1263213Javier1016000

Agora digamos que você é um analista em uma empresa de comércio eletrônico. Você quer analisar os pedidos com base no valor do pedido e dividi-los em baldes(muito baixo, baixo, médio, alto e muito alto) de acordo com o valor do pedido.

A declaração CASE pode ajudá-lo a conseguir isto. Aqui está a consulta que você escreveria:

SELECT  order_id,
	  CASE 
	  WHEN order_value <= 50 THEN 'Very Low'
  WHEN order_value > 50 AND order_value <= 200 THEN 'Low'
  WHEN order_value > 200 AND order_value <= 500 THEN 'Medium'
  WHEN order_value > 500 AND order_value <= 1000 THEN 'High'
  ELSE 'Very High' 
  END AS order_category
FROM    order_summary;

E aqui estão os resultados que você obteria:

order_idorder_category
A123Medium
A124Medium
A125Very High
A126High

Alternativamente, você também pode usar a consulta dada abaixo:

SELECT order_id,
 CASE
 WHEN order_value <= 50 THEN 'Very Low'
 WHEN order_value <= 200 THEN 'Low'
 WHEN order_value <= 500 THEN 'Medium'
 WHEN order_value <= 1000 THEN 'High'
 ELSE 'Very High'
END AS order_category
FROM order_summary;

Isto lhe dará exatamente o mesmo resultado, já que o CASE deixa de avaliar um valor uma vez que ele preencha os critérios em WHEN.

Agora, deixe-me detalhar estas consultas.

A primeira palavra-chave é SELECT, que especifica as colunas que você deseja retornar. Em nosso caso, estas colunas foram order_id e order_category, que usamos como pseudônimo para a declaração em CASE (CASE...END AS order_category).

A declaração CASE começa com a palavra-chave CASE. Ela é seguida pela palavra-chave WHEN, após a qual especificamos uma condição para avaliar (order_value <= 50). Isto é imediatamente seguido pela palavra THEN e o valor de retorno se a condição for verdadeira (‘Very Low’).

Por exemplo, pegue a primeira afirmação:

CASE WHEN order_value <= 50 THEN 'Very Low'

Nesta declaração, quando o valor do pedido for menor ou igual a $50, 'Muito Baixo' é retornado como um valor na coluna order_category. Em outras palavras, classificamos todos os pedidos com valor inferior a $50 ou igual a $50 na categoria "Muito Baixo".

Se esta condição não for verdadeira (o valor é superior a $50), a consulta verifica se o valor é superior a $200. Se for inferior a $200 mas superior a $50, então "Baixo" é retornado como o valor na coluna order_category. Se o valor for superior a $200, a consulta pula para a próxima cláusula WHEN, e assim por diante.

Se nenhuma das condições for avaliada como verdadeira, então o valor especificado em ELSE é retornado. Assim, a declaração CASE acrescenta lógica à sua declaração SELECT.

Se você é novo em SQL e quer entender como escrever este tipo de consulta, recomendo a faixa SQL de A a Z de LearnSQL.com.br. Ela começa com o básico de SQL e bancos de dados, e depois o guia até as consultas e funções mais sofisticadas. É uma ótima maneira de começar sua jornada SQL.

Se você estiver analisando muitos pedidos, a agregação seria útil em consultas como estas. Agregação significa agrupar registros semelhantes e depois usar uma métrica baseada nos valores agrupados para entender as características desse grupo. Em SQL, a cláusula GROUP BY é a sua entrada no mundo das estatísticas agregadas. (Para uma compreensão mais detalhada de GROUP BY, confira este artigo).

Por enquanto, vamos apenas ver como GROUP BY e CASE funcionam juntos. Aqui está uma versão atualizada de nossa consulta anterior:

SELECT  CASE 
	  WHEN order_value <= 50 THEN 'Very Low'
  WHEN order_value > 50 AND order_value <= 200 THEN 'Low'
  WHEN order_value > 200 AND order_value <= 500 THEN 'Medium'
  WHEN order_value > 500 AND order_value <= 1000 THEN 'High'
  ELSE 'Very High' 
  END AS order_category,
  COUNT(order_id)
FROM    order_summary
GROUP BY 1;

E a nova saída:

order_categoryCOUNT(order_id)
High1
Medium2
Very High1

Aqui, usamos COUNT como a função agregada. É assim que funciona. A cláusula GROUP BY agrega todos os registros pelos valores retornados na primeira coluna do SELECT. No nosso caso, esta é order_category.

Então, para cada valor diferente de order_category, COUNT(order_id) calculará o número total de pedidos pertencentes à categoria correspondente. A declaração CASE ajuda a decidir qual categoria atribuir para cada pedido. Em nossos dados, temos um total de 1 pedido na categoria 'Alto' (order_value entre 500 e 1000), 2 pedidos na categoria 'Médio' (order_value entre 200 e 500) e 1 pedido na categoria 'Muito Alto' (order_value maior que 1000).

Em todos os exemplos acima, a declaração CASE foi utilizada na parte SELECT da consulta. Entretanto, esta cláusula é bastante versátil e pode ser usada para retornar resultados baseados em condições em outras partes da consulta.

Portanto, agora que você tem uma idéia do que é a declaração CASE, vamos ver algumas outras maneiras de usá-la.

Usando CASO na Cláusula "ORDER BY".

A cláusula ORDER BY é usada para ordenar os resultados da consulta em uma determinada ordem. Por exemplo, você pode querer ordenar o número de pedidos feitos por cada cliente com base em customer_name. Aqui está a consulta que você escreveria:

SELECT   customer_name,
   COUNT(order_id)
FROM 	   order_summary
GROUP BY customer_name
ORDER BY customer_name;

E a saída é:

customer_nameCOUNT(order_id)
Emily1
Javier3

Aqui, a consulta ordena os resultados em ordem alfabética ascendente (porque você está ordenando por um valor de texto). A menos que você especifique o contrário, ORDER BY sempre usará ordem ascendente (isto é, A-Z, 1-10). Você pode colocar a palavra-chave DESC após a cláusula do nome da coluna para ordenar os resultados em ordem decrescente (Z-A, 10-1): ORDER BY customer_name DESC.

Suponha que você queira ordenar os registros por order_id em ordem ascendente. Entretanto, você quer mostrar primeiro as ordens de mais de 120 itens. Em outras palavras, primeiro você ordenará por quantidade de itens (onde a quantidade for maior que 120) e depois por ordem de identificação. Isto exigirá uma avaliação condicional na cláusula ORDER BY:

Query:
SELECT
  customer_name,
  order_id,
  order_value,
  quantity
FROM
  order_summary
ORDER BY
  CASE WHEN quantity > 120 THEN quantity END, order_id;

Aqui está a saída:

customer_nameorder_idorder_valuequantity
JavierA1252000123
EmilyA1232055
JavierA12430022
JavierA126600101

Nesta consulta, primeiro obtemos a customer_name, order_id, order_value e as colunas de quantidade da tabela. Ao ordenar as linhas, esta consulta primeiro recebe linhas onde a quantidade é maior que 120. (Neste caso, a quantidade é 123.) Como não temos outras linhas que atendam a esse critério, o restante das linhas são ordenadas por order_id.

Utilização do CASO na Cláusula WHERE

A cláusula WHERE é usada para filtrar registros dos resultados da consulta com base nas condições declaradas. Por exemplo, se sua empresa quiser renunciar a taxas de remessa para pedidos acima de US$ 100, você pode primeiro querer ver quantos pedidos serão qualificados e analisar o impacto. A seguinte cláusula WHERE contará apenas IDs para pedidos acima de US$ 100:

SELECT  COUNT(order_id)
FROM    order_summary
WHERE   order_value > 100;

E o resultado:

COUNT(order_id)
4

Com base no resultado, você assumirá que cerca de 4 pedidos serão impactados por isto. Naturalmente, este é o primeiro passo de sua análise; você provavelmente quererá fazer muitas análises mais detalhadas para quantificar o impacto.

Agora deixe-me dar-lhe um exemplo de como usar a cláusula WHERE com CASE. Dê uma olhada na influencer_list mesa:

influencer_nameinfluencer_channelyoutube_channelfb_channelmonth_yeartotal_views
LouisyoutubehungryLouisJan_20213200
JanetfacebookstylenmakeupJan_2021423444
MichaelfacebookInfl_brandXJan_20212322
MichaelfacebookInfl_brandXFeb_2021240000

Digamos que sua empresa utiliza vários influenciadores para promover suas marcas. Você quer ver todos os influenciadores cujo canal YouTube ou conta no Facebook usa diretamente seu nome ('BrandX').

Cada influenciador tem um tipo de canal/conta. Veja aqui como você descobriria quais mencionam BrandX:

SELECT DISTINCT influencer_name
FROM influencer_list
WHERE CASE WHEN influencer_channel = 'facebook' THEN fb_channel
	     WHEN influencer_channel = 'youtube' THEN youtube_channel
	     END LIKE '%brandX%';

Aqui está o resultado:

influencer_name
Michael

A consulta acima retornará todas as linhas onde ou youtube_channel ou fb_channel tem ‘brandX’. Como fazemos isso? Bem, você sabe como WHERE e CASE WHEN trabalham juntos. O novo elemento aqui é LIKE '%brandX%'. Tudo o que isso faz é dizer à consulta para retornar os canais influenciadores que contêm 'BrandX' em seu nome; LIKE é usado para combinar o valor da coluna com o padrão, e o sinal de porcentagem (%) indica que qualquer número de caracteres pode vir antes ou depois de 'BrandX (e é por isso que a % está em ambas as extremidades de BrandX).

Utilização do CASO na Cláusula HAVING

A cláusula HAVING é utilizada com a cláusula GROUP BY para filtrar os grupos que estão sendo exibidos. Por exemplo, se você quisesse ver os registros do influencer_list tabela onde total_views ao longo da vida do influenciador é maior do que um milhão, você escreveria:

SELECT      influencer_name,
	   SUM(total_views)
FROM     influencer_list
GROUP BY influencer_name
HAVING   SUM(total_views) > 200000;

E isto é o que você conseguiria:

influencer_nameSUM(total_views)
Michael242322
Janet423444

Você também pode usar CASE com a cláusula HAVING. Digamos que você queira obter uma lista de influenciadores cujas opiniões totais são maiores que 100 para o YouTube ou maiores que 400.000 para o Facebook.

SELECT      influencer_name,
	   influencer_channel,
	   SUM(total_views)
FROM     influencer_list
GROUP BY influencer_name,
	   influencer_channel
HAVING   CASE WHEN influencer_channel = 'youtube' 
        THEN SUM(total_views) > 100
  WHEN influencer_channel = 'facebook' 
  THEN SUM(total_views) > 400000
   END;

E o resultado:

influencer_nameinfluencer_channelSUM(total_views)
Louisyoutube3200
Janetfacebook423444

Esta consulta primeiro resume o total de visualizações por influencer_name e influencer_channel. Na cláusula HAVING, depois filtramos apenas aqueles grupos que têm mais de 100 visualizações para o YouTube e mais de 400.000 visualizações para o Facebook. Observe que Michael, que tem 242.322 visualizações no Facebook, não aparece na saída; seu total é inferior a 400.000 visualizações.

Usando o CASE em uma declaração UPDATE

Você também pode usar CASE em uma declaração UPDATE. A declaração SQL UPDATE é usada para alterar valores em uma tabela existente.

Imagine que você deseja atualizar os valores influencer_channel em nosso conjunto de dados atual, mudando os canais para um código de duas letras: 'youtube' tem que ser mudado para 'yt' e 'facebook' tem que ser mudado para 'fb'.

UPDATE influencer_list
SET     influencer_channel = CASE influencer_channel 
 			  WHEN 'youtube' THEN 'yt'
			  WHEN 'facebook' THEN 'fb'
			  ELSE 'invalid value'
			  END;

É assim que o influencer_list mesa cuidará da atualização:

influencer_nameinfluencer_channelyoutube_channelfb_channelmonth_yeartotal_views
LouisythungryLouisJan_20213200
JanetfbstylenmakeupJan_2021423444
MichaelfbInfl_brandXJan_20212322
MichaelfbInfl_brandXFeb_2021240000

Você notará que 'youtube' foi substituído por 'yt' e 'facebook' foi substituído por 'fb' na coluna do canal influencer_channel.

Você também pode usar CASE para excluir ou inserir linhas em suas tabelas. Leia este artigo sobre o uso do CASE com declarações modificadoras de dados para obter mais detalhes.

Pronto para usar o CASE em consultas SQL?

Depois de todos estes exemplos, tenho certeza que você tem uma idéia melhor de como o CASE funciona em SQL e as várias aplicações potenciais da instrução. Então, é hora de colocar seu aprendizado em ação! Ler sobre SQL certamente ajudará você a aprender, mas se você quiser se tornar um especialista, seu mantra é "Pratique!

Eu também recomendaria um bom curso de prática de SQL. O curso de prática LearnSQL.com.br utiliza exemplos práticos e casos de uso, e você não precisa configurar nada para começar - a Internet e um navegador é suficiente.

Quanto mais consultas você escrever, melhor você se tornará no CASE e em outros comandos SQL. Por que esperar? Comece agora!