Voltar para a lista de artigos Artigos
6 minutos de leitura

Como usar CASO em ORDEM POR SQL

Este artigo lhe mostrará como e quando usar CASO em um ORDEM POR cláusula.

Você já usou alguma vez uma declaração CASE? Tenho certeza que você já usou, pelo menos em uma declaração SELECT. Mas você já a usou em uma cláusula ORDER BY? Não? Você usará, assim que eu lhe mostrar como!

Não se preocupe se você nunca usou uma declaração CASE. Mostrarei e explicarei a você com um pequeno exemplo. Depois passarei para outros usos da declaração CASE, especialmente em uma cláusula ORDER BY.

Se você quiser praticar usando a declaração CASE, recomendo nosso curso interativo Como Criar Relatórios Básicos em SQL. Ela contém quase 100 exercícios e está focada no uso de CASE em problemas práticos de SQL. Se você quer múltiplas fontes de conhecimento, aqui está um artigo que explica o que é CASE.

O que é uma declaração CASE?

Para simplificar, é uma declaração SQL que passa e retorna valores de acordo com as condições especificadas. É a maneira da SQL escrever a lógica IF-THEN-ELSE e consiste em cinco palavras-chave: CASE, WHEN, THEN, ELSE, e END.

Quando usado em uma declaração SELECT, ele funciona assim: se for o caso em que a condição é cumprida, então devolver um determinado valor, ou senão devolver algum outro valor, e fim verificando as condições. A sintaxe é a seguinte:

CASE
 WHEN  THEN ,
 WHEN  THEN 
 ELSE 
END AS 

Acho que esta sintaxe é melhor explicada pela forma como funciona em um exemplo. O uso mais básico de CASE está em uma declaração em SELECT, então vamos começar com um exemplo.

Caso no SELECT

Aqui está a tabela films Vou usar neste exemplo:

idfilm_titleyeardirector
1True Grit2010The Coen Brothers
2Da 5 Bloods2020Spike Lee
3Alien1979Ridley Scott
4The Bridges Of Madison County1995Clint Eastwood
5Get Out2017Jordan Peele
6Annie Hall1977Woody Allen
7Goodfellas1990Martin Scorsese
8Dr.Strangelove1964Stanley Kubrick
9You Were Never Really Here2017Lynne Ramsay
10Albert Nobbs2011Rodrigo Garcia

Agora, digamos que queremos escrever uma pergunta que, junto com as colunas da tabela, mostre uma coluna adicional com o século em que o título foi filmado. Um exemplo de consulta é parecido com este:

SELECT
*,
	CASE
		WHEN year < 2001 THEN '20th-century film'
		ELSE '21st-century film'
	END AS century
FROM films;

Esta consulta seleciona todas as colunas da tabela films. Em seguida, usa uma declaração CASE para colocar valores em uma nova coluna chamada século. Esta declaração significa: quando o ano da coluna está abaixo (ou seja, mais antigo que) 2001, então o valor no século da coluna deve ser "filme do século 20". Se não for, então o valor deve ser "filme do século 21".

Vamos ver os resultados da consulta:

idfilm_titleyeardirectorcentury
1True Grit2010The Coen Brothers21st-century film
2Da 5 Bloods2020Spike Lee21st-century film
3Alien1979Ridley Scott20th-century film
4The Bridges Of Madison County1995Clint Eastwood20th-century film
5Get Out2017Jordan Peele21st-century film
6Annie Hall1977Woody Allen20th-century film
7Goodfellas1990Martin Scorsese20th-century film
8Dr.Strangelove1964Stanley Kubrick20th-century film
9You Were Never Really Here2017Lynne Ramsay21st-century film
10Albert Nobbs2011Rodrigo Garcia21st-century film

O CASO é usado somente em declarações SELECT?

Não! Embora seja usado com mais freqüência ali, CASE não se limita às declarações SELECT. Por exemplo, você pode usá-la em cláusulas como IN, WHERE, HAVING, e ORDER BY.

Usar uma declaração CASE em uma consulta uma vez não significa que você tenha atingido sua cota para usá-la. Você pode usá-la várias vezes em uma única consulta. Ou você pode usá-la apenas uma vez. Isto significa que você não precisa ter CASE em SELECT se você quiser usá-lo apenas em um ORDER BY.

Por falar nisso, o ponto principal deste artigo é mostrar a você como funciona a declaração CASE em uma cláusula ORDER BY. Estou chegando lá agora.

Quando uma declaração de caso é usada em um ORDER BY?

A cláusula ORDER BY é usada para ordenar o resultado em ordem ascendente ou descendente. Deseja uma atualização sobre como funciona? Não há problema! Este artigo explica o que um ORDER BY faz.

A introdução de uma declaração CASE aqui pode melhorar seu ORDER BY, permitindo que você ordene os resultados por alguns outros (e múltiplos) critérios. Por exemplo, você pode usá-la quando quiser ordenar os valores das cordas de acordo com alguns outros critérios além da ordem alfabética, como por exemplo, pelos cargos hierárquicos dos títulos de cargos em uma empresa.

A utilização de uma declaração CASE também permite ordenar os dados de acordo com múltiplos critérios. Por exemplo, você pode querer ordenar seus usuários por país e nome, mas por país e estado, se eles forem dos EUA.

Vou lhe mostrar um exemplo prático, e você saberá imediatamente do que estou falando.

Caso em ENCOMENDAR POR

Aqui, estaremos trabalhando com a tabela shopsque contém os seguintes dados:

idshop_namecountrystatecity
1Zoltan's shopCroatiaNULLZagreb
2Ante PortasCroatiaNULLRijeka
3Green Mile 1USATennesseeMemphis
4Jan Pieter's PitaCroatiaNULLSplit
5Green Mile 2USATennesseeChattanooga
6Green Mile 3USANew OrleansLouisiana
7Krystyna's shopHungaryNULLPecs
8Quinn & SandyHungaryNULLGyor
9Green Mile 4USACaliforniaSan Francisco
10FragolaCroatiaNULLOsijek

Temos que encomendar os dados por country primeiro. Depois, todas as lojas dentro do mesmo país devem ser classificadas por city. Se a loja estiver nos Estados Unidos, precisamos ordená-la em seguida pela coluna state. O código que resolve este pequeno problema é:

SELECT *
FROM shops
ORDER BY country,
	CASE
		WHEN country = 'USA' THEN state
		ELSE city
	END;

Ele seleciona todas as colunas da tabela shops. Em seguida, ordena o resultado primeiro por país, depois pelos critérios da declaração CASE. Ela diz que se country = 'USA', então o resultado é classificado por estado. Se não for, então é ordenado por city.

Parece que este código de fato retorna o resultado desejado:

idshop_namecountrystatecity
10FragolaCroatiaNULLOsijek
2Ante PortasCroatiaNULLRijeka
4Jan Pieter's PitaCroatiaNULLSplit
1Zoltan's shopCroatiaNULLZagreb
8Quinn & SandyHungaryNULLGyor
7Krystyna's shopHungaryNULLPecs
9Green Mile 4USACaliforniaSan Francisco
6Green Mile 3USANew OrleansLouisiana
5Green Mile 2USATennesseeChattanooga
3Green Mile 1USATennesseeMemphis

Outros Usos da Declaração CASE

Você também pode usar a declaração CASE com palavras-chave diferentes daquelas que mencionei. Por exemplo, você pode utilizá-la com DESC. Digamos que eu a coloquei no código acima:

SELECT *
FROM shops
ORDER BY country,
	CASE
		WHEN country = 'USA' THEN state
		ELSE city
	END DESC;

No exemplo anterior, eu omiti a palavra-chave DESC. O resultado é ordenado em ordem ascendente por padrão. Ao escrever DESC após a declaração CASE, você obtém as lojas dentro dos países encomendadas por city em ordem decrescente, não ascendente como no caso anterior. As lojas dos EUA são encomendadas por state, mas desta vez em ordem decrescente.

Podemos ver o resultado aqui:

idshop_namecountrystatecity
1Zoltan's shopCroatiaNULLZagreb
4Jan Pieter's PitaCroatiaNULLSplit
2Ante PortasCroatiaNULLRijeka
10FragolaCroatiaNULLOsijek
7Krystyna's shopHungaryNULLPecs
8Quinn & SandyHungaryNULLGyor
5Green Mile 2USATennesseeChattanooga
3Green Mile 1USATennesseeMemphis
6Green Mile 3USANew OrleansLouisiana
9Green Mile 4USACaliforniaSan Francisco

Você também pode usar as declarações CASE com UPDATE, INSERT, e DELETE. Estes são chamados de declarações modificadoras de dados. Aqui está um artigo que explica como usar CASE com essas afirmações. Você também pode usá-lo para resumos condicionais.

Deseja saber mais sobre a declaração CASE?

Provavelmente, é uma surpresa para você que CASE declarações não sejam usadas somente em declarações SELECT. Você já viu que ela vem a calhar quando usada com um ORDER BY. Ela abre as possibilidades de solicitar resultados de consulta.

Isso não é o fim. A declaração CASE pode ser usada com algumas outras declarações e palavras-chave, tais como declarações modificadoras de dados, ou mesmo DESC, IN, WHERE, e HAVING.

Agora é hora de aprender mais e praticar o que se aprende. Você obtém tudo isso com nosso curso Funções Comuns em SQL . Este curso é uma parte de uma trilha muito mais ampla chamada SQL de A a Z. De que você está esperando?