9.17.1. CASE
Expresia SQL CASE este o expresie condițională generică, similară instrucțiunilor if/else din alte limbaje de programare:
CASE WHEN condition THEN result END
Clasificațiile CASE pot fi utilizate oriunde o expresie este validă. Fiecare condiție este o expresie care returnează un rezultat boolean. Dacă rezultatul condiției este adevărat, valoarea expresiei CASE este rezultatul care urmează condiției, iar restul expresiei CASE nu este procesat. În cazul în care rezultatul condiției nu este adevărat, toate clauzele WHEN ulterioare sunt examinate în același mod. În cazul în care nici o condiție WHEN nu este adevărată, valoarea expresiei CASE este rezultatul clauzei ELSE. Dacă clauza ELSE este omisă și nicio condiție nu este adevărată, rezultatul este nul.
Un exemplu:
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
Tipurile de date ale tuturor expresiilor de rezultat trebuie să fie convertibile într-un singur tip de ieșire. A se vedea secțiunea 10.5 pentru mai multe detalii.
Există o formă „simplă” de expresie CASE care este o variantă a formei generale de mai sus:
CASE expression WHEN value THEN result END
Prima expresie este calculată, apoi comparată cu fiecare dintre expresiile de valoare din clauzele WHEN până când se găsește una care este egală cu ea. Dacă nu se găsește nicio potrivire, se returnează rezultatul clauzei ELSE (sau o valoare nulă). Acest lucru este similar cu instrucțiunea switch
din C.
Exemplul de mai sus poate fi scris folosind simpla sintaxă 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
O expresie CASE nu evaluează nicio subexpresie care nu este necesară pentru a determina rezultatul. De exemplu, acesta este un mod posibil de a evita un eșec al împărțirii la zero:
SELECT ... WHERE CASE WHEN x <> 0 THEN y/x > 1.5 ELSE false END;
Nota: După cum este descris în secțiunea 4.2.14, există diverse situații în care subexpresiile unei expresii sunt evaluate în momente diferite, astfel încât principiul conform căruia „CASE evaluează numai subexpresiile necesare” nu este de fier. De exemplu, o subexpresie constantă 1/0 va duce, de obicei, la un eșec de împărțire la zero în momentul planificării, chiar dacă se află în cadrul unui braț CASE care nu ar fi introdus niciodată în momentul execuției.
.