Torna all'elenco degli articoli Articoli
Tempo di lettura: 6 minuti

Come usare CASE in ORDER BY in SQL

Questo articolo vi mostrerà come e quando usare CASO in una clausola ORDINE PER in una clausola ORDER BY.

Avete mai usato un'istruzione CASE? Sicuramente sì, almeno in un'istruzione SELECT. Ma l'avete mai usata in una clausola ORDER BY? No? Lo farete, quando vi mostrerò come fare!

Non preoccupatevi se non avete mai usato un'istruzione CASE. Ve la mostrerò e spiegherò con un breve esempio. Poi passerò ad altri usi dell'istruzione CASE, in particolare in una clausola ORDER BY.

Se volete più fonti di conoscenza, ecco un articolo che spiega cos' èCASE. E un altro che spiega come usare CASE per aggiungere logica a una SELECT.

Che cos'è un'istruzione CASE?

In parole povere, è un'istruzione SQL che esamina e restituisce valori in base alle condizioni specificate. È il modo in cui SQL scrive la logica IF-THEN-ELSE e consiste in cinque parole chiave: CASE, WHEN, THEN, ELSE e END.

Quando viene utilizzata in un'istruzione SELECT, funziona in questo modo: se la condizione è soddisfatta, la condizione è soddisfatta. caso quando la condizione è soddisfatta, allora restituisce un certo valore, oppure else restituire un altro valore e fine controllare le condizioni. La sintassi è la seguente:

CASE
 WHEN  THEN ,
 WHEN  THEN 
 ELSE 
END AS 

Credo che questa sintassi si spieghi meglio con un esempio. L'uso più elementare di CASE è in un'istruzione SELECT, quindi iniziamo con un esempio.

CASE in SELECT

Ecco la tabella films che utilizzerò in questo esempio:

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

Supponiamo di voler scrivere una query che, oltre alle colonne della tabella, mostri un'ulteriore colonna con il secolo in cui il titolo è stato girato. Un esempio di query è questo:

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

Questa query seleziona tutte le colonne della tabella films. Poi utilizza un'istruzione CASE per inserire i valori in una nuova colonna chiamata secolo. Questa istruzione significa: quando la colonna anno è inferiore a (cioè più vecchia di) 2001, allora il valore nella colonna secolo deve essere "film del XX secolo". In caso contrario, il valore dovrebbe essere "film del XXI secolo".

Vediamo i risultati della query:

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

CASE si usa solo nelle dichiarazioni SELECT?

No! Anche se viene usato più spesso, CASE non si limita alle dichiarazioni SELECT. Ad esempio, è possibile utilizzarlo in clausole come IN, WHERE, HAVING e ORDER BY.

L'uso di un'istruzione CASE in una query una sola volta non significa che sia stata raggiunta la quota di utilizzo. È possibile utilizzarla più volte in una singola query. Oppure si può usare una sola volta. Ciò significa che non è necessario avere CASE in SELECT se si vuole usarlo solo in un ORDER BY.

A questo proposito, lo scopo principale di questo articolo è mostrare come funziona l'istruzione CASE in una clausola ORDER BY. Ora ci sto arrivando.

Quando si usa l'istruzione CASE in un ORDER BY?

La clausola ORDER BY viene utilizzata per ordinare i risultati in ordine crescente o decrescente. Volete un ripasso su come funziona? Nessun problema! Questo articolo spiega cosa fa un ORDER BY.

L'introduzione di un'istruzione CASE può migliorare il vostro ORDER BY sistema, consentendovi di ordinare i risultati in base ad altri (e molteplici) criteri. Ad esempio, è possibile utilizzarla quando si desidera ordinare i valori delle stringhe in base a criteri diversi dall'ordine alfabetico, ad esempio in base alla posizione gerarchica dei titoli di lavoro in un'azienda.

L'uso dell'istruzione CASE consente anche di ordinare i dati in base a più criteri. Ad esempio, potreste voler ordinare i vostri utenti in base al paese e al nome, ma anche in base al paese e allo stato, se provengono dagli Stati Uniti.

Vi mostrerò un esempio pratico e capirete subito di cosa sto parlando.

CASO in ORDER BY

In questo caso, lavoreremo con la tabella shopsche contiene i seguenti dati:

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

Per prima cosa dobbiamo ordinare i dati per country. Poi, ogni negozio all'interno dello stesso Paese deve essere ordinato per city. Se il negozio si trova negli Stati Uniti, dobbiamo ordinarlo in base alla colonna state. Il codice che risolve questo piccolo problema è il seguente:

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

Seleziona tutte le colonne della tabella shops. Quindi ordina i risultati prima in base al Paese e poi in base ai criteri dell'istruzione CASE. Dice che se country = 'USA', allora il risultato è ordinato per stato. Se non lo è, viene ordinato per city.

Sembra che questo codice restituisca effettivamente il risultato desiderato:

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

Altri usi dell'istruzione CASE

È possibile utilizzare l'istruzione CASE anche con parole chiave diverse da quelle citate. Ad esempio, si può usare con DESC. Supponiamo di inserirla nel codice precedente:

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

Nell'esempio precedente, ho omesso la parola chiave DESC. Il risultato è ordinato in ordine crescente per impostazione predefinita. Scrivendo DESC dopo l'istruzione CASE, si ottengono i negozi all'interno dei Paesi ordinati da city in ordine decrescente e non crescente come nel caso precedente. I negozi statunitensi sono ordinati da state, ma questa volta in ordine decrescente.

Il risultato è visibile qui:

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

È possibile utilizzare le istruzioni CASE anche con UPDATE, INSERT e DELETE. Si tratta delle cosiddette istruzioni di modifica dei dati. Qui trovate un articolo che spiega come usare CASE con queste istruzioni. È possibile utilizzarlo anche per il riepilogo condizionale.

Volete saperne di più sull'istruzione CASE?

Probabilmente vi sorprenderà il fatto che le istruzioni CASE non sono utilizzate solo nelle istruzioni SELECT. L'avete vista utile quando viene usata con un'istruzione ORDER BY. Essa apre le possibilità di ordinare i risultati delle query.

Ma non è finita qui. L'istruzione CASE può essere usata con altre istruzioni e parole chiave, come le istruzioni di modifica dei dati o anche DESC, IN, WHERE e HAVING.

Ora è il momento di imparare di più e di mettere in pratica ciò che si è imparato. Tutto questo è possibile con il nostro corso Standard SQL Functions . Questo corso fa parte di un percorso molto più ampio denominato SQL from A to Z. Cosa state aspettando?