9.17.1. CASE

Wyrażenie SQL CASE jest ogólnym wyrażeniem warunkowym, podobnym do wyrażeń if/else w innych językach programowania:

CASE WHEN condition THEN result END

Klauzule CASE mogą być stosowane wszędzie tam, gdzie wyrażenie jest poprawne. Każdy warunek jest wyrażeniem, które zwraca wynik typu boolean. Jeżeli wynik warunku jest prawdziwy, to wartością wyrażenia CASE jest wynik, który następuje po warunku, a pozostała część wyrażenia CASE nie jest przetwarzana. Jeżeli wynik warunku nie jest prawdziwy, to wszystkie kolejne klauzule WHEN są badane w ten sam sposób. Jeżeli żaden z warunków WHEN nie daje wyniku true, to wartością wyrażenia CASE jest wynik klauzuli ELSE. Jeśli klauzula ELSE jest pominięta i żaden warunek nie jest prawdziwy, wynikiem jest null.

Przykład:

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

Typy danych wszystkich wyrażeń wynikowych muszą być konwertowalne na jeden typ wyjściowy. Zobacz rozdział 10.5, aby uzyskać więcej szczegółów.

Istnieje „prosta” forma wyrażenia CASE, która jest wariantem powyższej formy ogólnej:

CASE expression WHEN value THEN result END

Pierwsze wyrażenie jest obliczane, a następnie porównywane z każdym z wyrażeń wartości w klauzulach WHEN, dopóki nie zostanie znalezione jedno, które jest mu równe. Jeśli nie zostanie znaleziony żaden odpowiednik, zwracany jest wynik klauzuli ELSE (lub wartość null). Jest to podobne do instrukcji switch w języku C.

Powyższy przykład może być napisany przy użyciu prostej składni 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

Wyrażenie CASE nie ocenia żadnych podwyrażeń, które nie są potrzebne do określenia wyniku. Na przykład, jest to możliwy sposób na uniknięcie błędu dzielenia przez zero:

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

Uwaga: Jak opisano w rozdziale 4.2.14, istnieją różne sytuacje, w których podwyrażenia wyrażenia są obliczane w różnym czasie, więc zasada, że „CASE ocenia tylko niezbędne podwyrażenia” nie jest żelazna. Na przykład, stałe podwyrażenie 1/0 zazwyczaj spowoduje błąd dzielenia przez zero w czasie planowania, nawet jeśli znajduje się w ramieniu CASE, które nigdy nie zostałoby wprowadzone w czasie wykonywania.

.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.