Database
 sql >> Database >  >> RDS >> Database

Come scrivere un'istruzione CASE in SQL

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
  WHEN  THEN ,
  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.