9.17.1. CASE

Az SQL CASE kifejezés egy általános feltételes kifejezés, hasonlóan más programozási nyelvek if/else utasításaihoz:

CASE WHEN condition THEN result END

A CASE záradékok mindenütt használhatók, ahol egy kifejezés érvényes. Minden feltétel egy kifejezés, amely egy boolean eredményt ad vissza. Ha a feltétel eredménye igaz, akkor a CASE kifejezés értéke a feltétel utáni eredmény, és a CASE kifejezés többi része nem kerül feldolgozásra. Ha a feltétel eredménye nem igaz, az ezt követő WHEN-kifejezések ugyanúgy kerülnek vizsgálatra. Ha egyetlen WHEN feltétel sem ad igaz eredményt, akkor a CASE kifejezés értéke az ELSE záradék eredménye. Ha az ELSE záradék kimarad, és egyetlen feltétel sem igaz, az eredmény nulla.

Egy példa:

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

Az összes eredménykifejezés adattípusának egyetlen kimeneti típusba kell konvertálhatónak lennie. További részletekért lásd a 10.5. szakaszt.

Létezik a CASE kifejezésnek egy “egyszerű” formája, amely a fenti általános forma egyik változata:

CASE expression WHEN value THEN result END

Az első kifejezést kiszámítjuk, majd összehasonlítjuk a WHEN záradékokban szereplő minden egyes értékkifejezéssel, amíg nem találunk egyet, amelyik megegyezik vele. Ha nem találunk egyezést, akkor az ELSE záradék eredménye (vagy egy nulla érték) kerül visszaadásra. Ez hasonló a switch utasításhoz C-ben.

A fenti példa megírható az egyszerű CASE szintaxissal:

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

A CASE kifejezés nem értékel ki olyan részkifejezéseket, amelyek nem szükségesek az eredmény meghatározásához. Így például elkerülhető a nullával való osztás hibája:

SELECT ... WHERE CASE WHEN x <> 0 THEN y/x > 1.5 ELSE false END;

Megjegyzés: A 4.2.14. szakaszban leírtak szerint számos olyan helyzet létezik, amikor egy kifejezés részkifejezései különböző időpontokban kerülnek kiértékelésre, így a “CASE csak a szükséges részkifejezéseket értékeli ki” elv nem vasszigorú. Például egy konstans 1/0 alkifejezés általában tervezési időben nullával való osztáshibát eredményez, még akkor is, ha egy olyan CASE-karon belül van, amelyet futási időben soha nem adnánk meg.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.