Pular para o conteúdo principal

Explicação da instrução CASE no SQL

Entenda como explorar a instrução CASE do SQL para criar colunas categóricas.
Actualizado 16 de jan. de 2025  · 7 min de leitura

Se você já trabalhou com bancos de dados, provavelmente notou que os dados raramente são perfeitos e muitas vezes exigem manipulação para extrair insights significativos.

Para atender a essa necessidade, o SQL oferece uma construção poderosa, chamada de instrução CASE, que permite que você crie novas colunas ou transforme dados com base nas condições aplicadas às colunas existentes.

Neste artigo, explicaremos o que é uma declaração CASE, por que ela é essencial e exploraremos vários casos de uso para ajudar você a aproveitar seu potencial. Vamos começar!

O que é uma declaração CASE?

A instrução Case no SQL é uma expressão condicional que introduz uma lógica de tomada de decisão em sua consulta. Ele funciona de forma semelhante a uma instrução declaração if-elif-else em Pythonpermitindo que você avalie várias condições e retorne resultados específicos com base nessas condições.

A sintaxe geral é a seguinte:

CASE
	WHEN boolean_condition1 THEN result1
	WHEN boolean_condition2 THEN result2
	ELSE result3
END

Veja como isso funciona:

  • A palavra-chave CASE marca o início da expressão, enquanto END marca sua conclusão, encerrando a declaração condicional como um quadro.
  • Cada cláusula WHEN avalia uma condição. Se a condição for verdadeira, a cláusula THEN correspondente retornará um resultado especificado.
  • Se nenhuma dessas condições nas cláusulas WHEN for atendida, a cláusula ELSE fornecerá um resultado padrão.

Por que a declaração CASE é importante?

A instrução CASE WHEN é uma ferramenta valiosa nas consultas SQL, oferecendo vários benefícios importantes:

  • Transformação de dadosTransformação de dados: permite que você crie novas colunas com base nos valores das colunas existentes.
  • Agregação condicionalPermite que você crie valores agregados (por exemplo, somas, contagens, máximos) para subconjuntos específicos de dados com base em condições.
  • Filtragem de dadosVocê pode incluir ou excluir linhas com base em critérios específicos.
  • Simplificação de consultas e legibilidade: Ele ajuda a consolidar a lógica em uma única consulta, reduzindo a necessidade de várias consultas, tabelas temporárias ou uniões complexas.
  • Otimização do desempenhoSe você quiser otimizar o desempenho de suas consultas SQL, a instrução CASE também pode contribuir para otimizar o desempenho e minimizar o tempo de execução, especialmente quando evita a necessidade de cálculos e transformações adicionais.

Declaração CASE simples

Neste artigo, usaremos a tabela film do banco de dados cinema. Vamos supor que você queira criar uma nova coluna categórica com base nos valores de ROI (relação entre bruto e orçamento):

SELECT 
	title,
	gross,
	budget,
	gross / budget AS ROI,
CASE
	 WHEN gross / budget < 1 THEN 'low ROI'
	 WHEN gross / budget BETWEEN 1 AND 2 THEN 'medium ROI'
	 ELSE 'high ROI'
END as ROI_group
FROM cinema.films
WHERE budget > 0 AND gross > 0 AND release_year = 2015;

Considerando o valor bruto e o orçamento, calculamos o ROI, que é uma métrica de lucratividade popular que mede a receita gerada por um investimento.

Além do campo ROI, também obtivemos sua categorização para nos comunicarmos melhor:

  • Se os filmes com ROI forem menores que 1, o valor será "ROI baixo"
  • Os filmes com ROI entre 1 e 2 pertencem à categoria "ROI médio"
  • "ROI alto" é o rótulo atribuído aos filmes com um ROI maior ou igual a 2.

Também filtramos os filmes com orçamentos ou valores brutos zero ou negativos. Além disso, restringimos os resultados aos filmes lançados em 2015.

Uso do CASE na cláusula Group By

No primeiro exemplo, criamos um novo campo, que pode ser aplicado para agregar os dados e obter insights adicionais.

Por exemplo, podemos calcular a média bruta e o orçamento médio para cada grupo de ROI:

SELECT 
CASE
	 WHEN gross / budget < 1 THEN 'low ROI'
	 WHEN gross / budget BETWEEN 1 AND 2 THEN 'medium ROI'
	 ELSE 'high ROI'
END AS ROI_group,
avg(gross) as avg_gross,
avg(budget) as avg_budget
FROM cinema.films
WHERE budget > 0 AND gross > 0 AND release_year = 2015
GROUP BY
CASE
	 WHEN gross / budget < 1 THEN 'low ROI'
	 WHEN gross / budget BETWEEN 1 AND 2 THEN 'medium ROI'
	 ELSE 'high ROI'
END
ORDER BY avg(gross) DESC
;

Para agrupar os dados, basta colocar a instrução case na cláusula GROUP BY. Para obter insights adicionais, ordenamos as linhas em ordem decrescente com base no valor bruto médio. Dessa forma, você pode identificar que a média bruta mais alta é atribuída ao ROI alto e vice-versa para o ROI baixo.

Uso do CASE na cláusula WHERE

Outro benefício da instrução CASE é que ela permite filtrar as linhas com base em condições específicas. Por exemplo, podemos aplicar diferentes limites de ROI com base no idioma do filme. Sabe-se que os filmes ingleses têm um ROI consistentemente alto. Portanto, o limite deve ter um valor mais alto, enquanto supomos que os outros idiomas tenham um ROI mais baixo.

SELECT 
    title,
    gross,
    budget,
    language,
    gross / budget AS ROI
FROM cinema.films
WHERE 
    CASE 
        WHEN language = 'English' THEN gross / budget > 2 -- English films need ROI > 2
        WHEN language = 'French' THEN gross / budget > 1.5 -- French films need ROI > 1.5
        ELSE gross / budget > 1.3 -- Default for other languages
    END;

Cálculo de agregações

Também podemos nos interessar em calcular o número de filmes com alto ROI versus baixo ROI lançados em 2015:

SELECT 
    SUM(CASE WHEN gross / budget > 2 THEN 1 ELSE 0 END) AS high_roi_films,
    SUM(CASE WHEN gross / budget BETWEEN 1 AND 2 THEN 1 ELSE 0 END) AS medium_roi_films,
    SUM(CASE WHEN gross / budget < 1 THEN 1 ELSE 0 END) AS low_roi_films
FROM cinema.films
WHERE budget > 0 AND gross > 0 AND release_year = 2015;

Dentro da função SUM, é como se criássemos um novo campo com valor 1 quando o ROI atinge esse limite e 0 caso contrário. Se considerarmos a soma dessa nova variável binária, obteremos o número de filmes que respeitam esse critério.

A partir do resultado, podemos observar que a maioria dos filmes tem um ROI inferior a 1, enquanto poucos filmes são altamente lucrativos.

Declaração de caso aninhada

Um dos casos de uso mais avançados é a instrução de caso aninhado, que é um caso dentro de um caso. É muito útil quando você precisa dividir os dados em subgrupos e aplicar uma lógica diferente para cada subgrupo. 

Da mesma forma que no primeiro exemplo, queremos criar uma nova coluna que deve ser influenciada pelos valores de ROI. Como dissemos anteriormente, o ROI dos filmes em inglês é alto globalmente em comparação com os filmes em outros idiomas. 

Por esse motivo, seria melhor categorizar os filmes em grupos de ROI, considerando tanto o ROI quanto o idioma

SELECT 
    title,
    language,
    gross / budget AS ROI,
    CASE
        WHEN language = 'English' THEN 
            CASE 
                WHEN gross / budget < 2 THEN 'low ROI'
                WHEN gross / budget BETWEEN 2 AND 3 THEN 'medium ROI'
                ELSE 'high ROI'
            END
        ELSE 
            CASE
                WHEN gross / budget < 1 THEN 'low ROI'
                WHEN gross / budget BETWEEN 1 AND 2 THEN 'medium ROI'
                ELSE 'high ROI'
            END
    END AS ROI_group
FROM cinema.films
WHERE budget > 0 AND gross > 0 and release_year = 2006;

Na consulta, a instrução CASE externa é usada para avaliar se o idioma é inglês ou não. Dependendo do idioma, o CASE interno avalia a ROI: os limites são mais altos para filmes em inglês e mais baixos para filmes que não sejam em inglês. Essa condição de vários níveis permite melhorar a separação de filmes com baixo, médio e alto teor de ferro.

Conclusão

A instrução CASE é uma construção SQL indispensável para que você possa extrair insights significativos dos seus dados. A teoria é alternada com exemplos práticos para ajudar você a compreender profundamente essa poderosa expressão condicional. Se você quiser se aprofundar mais, dê uma olhada no manipulação de dados no curso SQL. Ele aborda a instrução CASE, bem como outros aspectos importantes do SQL, como subconsultas e funções de janela. Por fim, você deve verificar o Fundamentos de SQL para que você tenha uma visão geral dos cursos que ajudam a dominar o SQL.


Eugenia Anello's photo
Author
Eugenia Anello
LinkedIn
Temas

Principais cursos de SQL

programa

Fundamentos de SQL

26 horas hr
Domine os fundamentos do SQL necessários para os negócios, aprenda a escrever consultas SQL e comece a analisar seus dados usando essa linguagem poderosa.
Ver DetalhesRight Arrow
Iniciar curso
Certificação disponível

curso

Manipulação de dados em SQL

4 hr
250.8K
Domine as consultas SQL complexas necessárias para responder a uma ampla variedade de perguntas sobre ciência de dados e preparar conjuntos de dados robustos para análise no PostgreSQL.
Ver maisRight Arrow
Relacionado

tutorial

Entendendo a função SQL DECODE()

Saiba como usar DECODE() no Oracle para lógica condicional na transformação de dados. Compare DECODE() com a instrução CASE WHEN em termos de desempenho e comportamento.
Allan Ouko's photo

Allan Ouko

11 min

tutorial

Tutorial de visão geral do banco de dados SQL

Neste tutorial, você aprenderá sobre bancos de dados em SQL.
DataCamp Team's photo

DataCamp Team

3 min

tutorial

SELEÇÃO de várias colunas no SQL

Saiba como selecionar facilmente várias colunas de uma tabela de banco de dados em SQL ou selecionar todas as colunas de uma tabela em uma consulta simples.
DataCamp Team's photo

DataCamp Team

3 min

tutorial

Função SQL COALESCE

COALESCE() é uma das funções mais úteis do SQL. Leia este tutorial para saber como dominá-lo.
Travis Tang 's photo

Travis Tang

4 min

tutorial

Como usar um alias SQL para simplificar suas consultas

Explore como o uso de um alias SQL simplifica os nomes de colunas e tabelas. Saiba por que usar um alias SQL é fundamental para melhorar a legibilidade e gerenciar uniões complexas.
Allan Ouko's photo

Allan Ouko

9 min

tutorial

Como usar GROUP BY e HAVING no SQL

Um guia intuitivo para você descobrir os dois comandos SQL mais populares para agregar linhas do seu conjunto de dados
Eugenia Anello's photo

Eugenia Anello

6 min

Ver maisVer mais