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.