Problema:
Vuoi utilizzare un'istruzione CASE in SQL.
Esempio:
Hai i risultati degli esami nell'exam
tavolo. Devi assegnare ogni risultato a uno dei seguenti valori di testo:'bad result'
, 'average result'
o 'good result'
. I risultati negativi sono quelli al di sotto di 40, i risultati buoni sono quelli sopra i 70 e il resto sono risultati medi.
L'exam
la tabella si presenta così:
nome | risultato |
---|---|
Toby Shaw | 56 |
Casey Watson | 49 |
Bennie Lynn | 23 |
Lane Sloan | 70 |
Steff Fox | 85 |
Reggie Ward | 40 |
Gail Kennedy | 66 |
Brice Mueller | 90 |
Soluzione 1:
SELECT name, result, CASE WHEN result < 40 THEN 'bad result' WHEN result > 70 THEN 'good result' ELSE 'average result' END AS category FROM exam;
La tabella dei risultati si presenta così:
nome | risultato | categoria |
---|---|---|
Toby Shaw | 56 | risultato medio |
Casey Watson | 49 | risultato medio |
Bennie Lynn | 23 | risultato pessimo |
Lane Sloan | 70 | risultato medio |
Steff Fox | 85 | buon risultato |
Reggie Ward | 40 | risultato medio |
Gail Kennedy | 66 | risultato medio |
Brice Mueller | 90 | buon risultato |
Discussione:
Per visualizzare un valore in base alle tue condizioni specifiche, devi scrivere un CASE
dichiarazione. La sintassi è:
CASE WHENTHEN , WHEN THEN , … ELSE END AS
Se condition_1
è soddisfatto, il valore recuperato è value_1
. In caso contrario, il database verifica la condition_2
. Se condition_2
è true, il valore recuperato è value_2
. Se nessuna di queste condizioni è soddisfatta, SQL verifica le condizioni rimanenti una per una fino a quando una delle condizioni non viene soddisfatta. Se nessuna delle condizioni è soddisfatta, il value_n
specificato dopo ELSE
viene recuperato.
Il ELSE
parte è facoltativa. Se lo ometti e nessuna delle condizioni è soddisfatta, ottieni un NULL
.
Ricordati di END
il CASE
clausola quando hai finito con tutte le condizioni. Ovviamente, come per qualsiasi colonna che crei, puoi rinominarla (AS <column_name>
).
Nel nostro esempio, 'bad result'
viene assegnato quando result < 40, and 'good result'
viene assegnato quando result > 70
. Se nessuna di queste condizioni è soddisfatta, il valore è 'average result'
. Inoltre, per nominare la colonna dei valori di testo appena creata, è necessario utilizzare un alias (AS
categoria). Ecco come ottieni:
CASE WHEN result < 40 THEN 'bad result' WHEN result > 70 THEN 'good result' ELSE 'average result' END AS category
Poiché 'average result'
è assegnato a risultati compresi tra 40
e 70
(incluso), puoi anche scrivere una condizione invece di ELSE
(vedi Soluzione 2 di seguito). Tuttavia, è più facile usare ELSE
.
Soluzione 2:
SELECT name, result, CASE WHEN result < 40 THEN 'bad result' WHEN result > 70 THEN 'good result' WHEN result >= 40 AND result <= 70 THEN 'average result' END AS category FROM exam;
La tabella dei risultati si presenta così:
nome | risultato | categoria |
---|---|---|
Toby Shaw | 56 | risultato medio |
Casey Watson | 49 | risultato medio |
Bennie Lynn | 23 | risultato pessimo |
Lane Sloan | 70 | risultato medio |
Steff Fox | 85 | buon risultato |
Reggie Ward | 40 | risultato medio |
Gail Kennedy | 66 | risultato medio |
Brice Mueller | 90 | buon risultato |
Discussione:
Poiché 'average result'
è assegnato a risultati compresi tra 40
e 70
(incluso), puoi scrivere la seguente condizione invece di un ELSE
:
WHEN result >= 40 AND result <= 70 THEN 'average result'
Se non usi un ELSE
e non voglio alcun NULL
s nella category
colonna, devi assicurarti di prenderti cura di tutti i possibili result
valori. Se c'è un result
che non soddisfa nessuna delle condizioni, ottieni un NULL
.
Soluzione 3:
SELECT name, result, CASE WHEN result < 40 THEN 'bad result' WHEN result <= 70 THEN 'average result' ELSE 'good result' END AS category FROM exam;
La tabella dei risultati si presenta così:
nome | risultato | categoria |
---|---|---|
Toby Shaw | 56 | risultato medio |
Casey Watson | 49 | risultato medio |
Bennie Lynn | 23 | risultato pessimo |
Lane Sloan | 70 | risultato medio |
Steff Fox | 85 | buon risultato |
Reggie Ward | 40 | risultato medio |
Gail Kennedy | 66 | risultato medio |
Brice Mueller | 90 | buon risultato |
Discussione:
Le condizioni specificate in CASE
possono essere non sovrapponibili come nelle soluzioni precedenti o sovrapponibili come in questa soluzione. La prima condizione è la stessa di prima:per result < 40
, la category
è 'bad result'
. Tutti i risultati sotto 40
viene assegnato questo valore a questo punto e non devi più fare nulla con loro. Ciò significa che non è necessario assicurarsi che result >= 40
nello specificare le condizioni per il 'average result'
– tutti i risultati inferiori a 40 hanno già il valore 'bad result'
assegnato. Infine, per i restanti risultati la categoria dovrebbe essere 'good result'
; un semplice ELSE 'good result'
se ne prende cura. Ecco come ottieni:
CASE WHEN result < 40 THEN 'bad result' WHEN result <= 70 THEN 'average result' ELSE 'good result' END AS category
Nota:l'ordine delle condizioni in CASE
importa. Se inverti l'ordine delle prime due condizioni (cioè, se specifichi WHEN result <= 70 THEN 'average result'
prima poi WHEN result <= 70 THEN 'average result'
secondo), tutti i risultati sono inferiori o uguali a 70
finiscono nel 'average result'
categoria, senza risultati assegnati a 'bad result'
categoria.