9.17.1. CASE

Výraz CASE v jazyce SQL je obecný podmíněný výraz, podobný příkazům if/else v jiných programovacích jazycích:

CASE WHEN condition THEN result END

Klausule CASE lze použít všude tam, kde výraz platí. Každá podmínka je výraz, který vrací logický výsledek. Pokud je výsledek podmínky pravdivý, je hodnotou výrazu CASE výsledek, který následuje za podmínkou, a zbytek výrazu CASE se nezpracovává. Pokud výsledek podmínky není pravdivý, jsou všechny následující klauzule WHEN zkoumány stejným způsobem. Pokud žádná podmínka WHEN nedává pravdivý výsledek, je hodnotou výrazu CASE výsledek klauzule ELSE. Pokud je klauzule ELSE vynechána a žádná podmínka není pravdivá, výsledkem je nula.

Příklad:

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

Datové typy všech výsledkových výrazů musí být převoditelné na jediný výstupní typ. Další podrobnosti najdete v kapitole 10.5.

Existuje „jednoduchá“ forma výrazu CASE, která je variantou výše uvedené obecné formy:

CASE expression WHEN value THEN result END

První výraz se vypočítá, pak se porovná s každým z hodnotových výrazů v klauzulích WHEN, dokud se nenajde takový, který se mu rovná. Pokud není nalezena žádná shoda, je vrácen výsledek klauzule ELSE (nebo nulová hodnota). To je podobné příkazu switch v jazyce C.

Výše uvedený příklad lze zapsat pomocí jednoduché syntaxe 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

Výraz CASE nevyhodnocuje žádné podvýrazy, které nejsou potřebné k určení výsledku. Například takto se lze vyhnout chybě při dělení nulou:

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

Poznámka: Jak je popsáno v kapitole 4.2.14, existují různé situace, kdy se podvýrazy výrazu vyhodnocují v různých časech, takže zásada, že „CASE vyhodnocuje pouze potřebné podvýrazy“, není železná. Například konstantní podvýraz 1/0 obvykle vede k chybě dělení nulou v době plánování, i když je uvnitř ramene CASE, které by v době běhu nikdy nebylo zadáno.

.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.