9.17.1. CASE
L’espressione SQL CASE è un’espressione condizionale generica, simile alle istruzioni if/else in altri linguaggi di programmazione:
CASE WHEN condition THEN result END
Le clausole CASE possono essere usate ovunque un’espressione sia valida. Ogni condizione è un’espressione che restituisce un risultato booleano. Se il risultato della condizione è vero, il valore dell’espressione CASE è il risultato che segue la condizione, e il resto dell’espressione CASE non viene elaborato. Se il risultato della condizione non è vero, qualsiasi clausola WHEN successiva viene esaminata allo stesso modo. Se nessuna condizione WHEN risulta vera, il valore dell’espressione CASE è il risultato della clausola ELSE. Se la clausola ELSE è omessa e nessuna condizione è vera, il risultato è nullo.
Un esempio:
SELECT * FROM test; a--- 1 2 3SELECT a, CASE WHEN a=1 THEN 'one' WHEN a=2 THEN 'two' ELSE 'other' END FROM test; a | case---+------- 1 | one 2 | two 3 | other
I tipi di dati di tutte le espressioni di risultato devono essere convertibili in un unico tipo di output. Vedere la Sezione 10.5 per maggiori dettagli.
C’è una forma “semplice” di espressione CASE che è una variante della forma generale di cui sopra:
CASE expression WHEN value THEN result END
La prima espressione viene calcolata, poi confrontata con ciascuna delle espressioni di valore nelle clausole WHEN fino a quando non ne viene trovata una che è uguale ad essa. Se non viene trovata nessuna corrispondenza, viene restituito il risultato della clausola ELSE (o un valore nullo). Questo è simile all’istruzione switch
in C.
L’esempio sopra può essere scritto usando la semplice sintassi CASE:
SELECT a, CASE a WHEN 1 THEN 'one' WHEN 2 THEN 'two' ELSE 'other' END FROM test; a | case---+------- 1 | one 2 | two 3 | other
Un’espressione CASE non valuta le sottoespressioni che non sono necessarie per determinare il risultato. Per esempio, questo è un possibile modo di evitare un fallimento della divisione per zero:
SELECT ... WHERE CASE WHEN x <> 0 THEN y/x > 1.5 ELSE false END;
Nota: Come descritto nella Sezione 4.2.14, ci sono varie situazioni in cui le sottoespressioni di un’espressione sono valutate in momenti diversi, così che il principio che “CASE valuta solo le sottoespressioni necessarie” non è ferreo. Per esempio una sottoespressione costante 1/0 risulterà di solito in un errore di divisione per zero al momento della pianificazione, anche se è all’interno di un braccio CASE che non verrebbe mai inserito al momento dell’esecuzione.