9.17.1. CASE
SQL:n CASE-lauseke on yleinen ehdollinen lauseke, joka on samanlainen kuin if/else-lausekkeet muissa ohjelmointikielissä:
CASE WHEN condition THEN result END
CASE-lausekkeita voidaan käyttää kaikkialla, missä lauseke on voimassa. Jokainen ehto on lauseke, joka palauttaa boolen tuloksen. Jos ehdon tulos on tosi, CASE-lausekkeen arvo on ehtoa seuraava tulos, eikä CASE-lausekkeen loppuosaa käsitellä. Jos ehdon tulos ei ole tosi, kaikki seuraavat WHEN-lausekkeet tutkitaan samalla tavalla. Jos mikään WHEN-ehto ei tuota totuutta, CASE-lausekkeen arvo on ELSE-lausekkeen tulos. Jos ELSE-lauseke jätetään pois eikä mikään ehto ole tosi, tulos on nolla.
Esimerkki:
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
Kaikkien tuloslausekkeiden tietotyyppien on oltava muunnettavissa yhdeksi tulostyypiksi. Katso lisätietoja kohdasta 10.5.
On olemassa CASE-lausekkeen ”yksinkertainen” muoto, joka on muunnelma yllä olevasta yleisestä muodosta:
CASE expression WHEN value THEN result END
Ensimmäinen lauseke lasketaan, sitten sitä verrataan jokaiseen WHEN-lausekkeissa olevaan arvolausekkeeseen, kunnes löydetään yksi, joka on yhtä suuri kuin se. Jos vastaavaa ei löydy, palautetaan ELSE-lausekkeen tulos (tai nolla-arvo). Tämä on samanlainen kuin switch
-lause C:ssä.
Yllä oleva esimerkki voidaan kirjoittaa käyttämällä yksinkertaista CASE-syntaksia:
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
CASE-lauseke ei evaluoi mitään sellaisia alilausekkeita, joita ei tarvita tuloksen määrittämiseen. Esimerkiksi tämä on mahdollinen tapa välttää jakovirhe nollalla:
SELECT ... WHERE CASE WHEN x <> 0 THEN y/x > 1.5 ELSE false END;
Huomautus: Kuten luvussa 4.2.14 on kuvattu, on olemassa erilaisia tilanteita, joissa lausekkeen alilausekkeet evaluoidaan eri aikoina, joten periaate, jonka mukaan ”CASE evaluoi vain välttämättömät alilausekkeet”, ei ole aukoton. Esimerkiksi vakio 1/0-alilauseke johtaa yleensä suunnitteluaikana jako nollalla -virheeseen, vaikka se olisi CASE-varren sisällä, jota ei koskaan syötettäisi suoritusaikana.