12th Dec 2022 10 minutos de leitura Como utilizar o CASO em SQL Himanshu Kathuria sql aprender sql CASE Índice O que é a declaração CASE? Usando CASO na Cláusula "ORDER BY". Utilização do CASO na Cláusula WHERE Utilização do CASO na Cláusula HAVING Usando o CASE em uma declaração UPDATE Pronto para usar o CASE em consultas 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! Tags: sql aprender sql CASE