Funkcje wbudowane SQL – cz.2

Druga część tego małego zbioru informacji o funkcjach wbudowanych to tak na prawdę uzupełnienie o dwie ważne funkcje.

Pierwszą z nich jest funkcja skalarna decode.

składnie decode:

decode (wyrażenie_testowane,

wartość_a_1, wartość_b_1,

wartość_a_2, wartość_b_2,

…..,

wartość_a_n, wartość_b_n,

wartość_domyślna)

A oto opis tego co zapisaliśmy: funkcja testuje wartość wyrażenia testowanego i zwraca wartość_b_x w przypadku, gdy wyrażenie testowane ma wartość_a_x. Jeżeli żadne z wartości_a_x nie jest równe wartości testowanej, to funkcja zwraca wartość_domyślna.

myślę, że sprawa jest tutaj prosta. Ale… dla przykładu zróbmy selecta.

SELECT tow_nazwa, tow_cena,

decode (tow_podatek,

22, ‚podatek pełny’,

7, ‚podatek ulgowy’,

‚brak podatku’) podatki

FROM towary;

Możemy łatwo teraz ocenić, że z tabelki towary wybieramy nazwę i cenę oraz kolumnę podatki, która wypisze nam ‚podatek pełny’ lub ‚podatek ulgowy’ w zależności czy w kolumnie tow_podatek znajdzie 22 czy 7. Jeśli nic nie znajdzie – napisze ‚brak podatku’.

FUNKCJA DECODE ROZUMIE NULL - co nie jest tak oczywiste w przypadku kolejnej funkcji :) (mam tu na myśli rozumienie w sensie niepomijania, nie wypisywania 0 ani błędu. Rozumie także jeśli testujemy NULL)

Kolejna funkcja to właściwie całe wyrażenie – CASE

W pewnym zakresie odpowiada ono funkcji DECODE. Pozwala nam kształtować wartość zwracanej kolumny w sposób elastyczny i dynamicznie modyfikowany.

Oto składnia:

SELECT tow_nazwa, CASE tow_podatek

WHEN 22 THEN ‚normalny’

WHEN 7 THEN ‚ulgowy’

ELSE ‚maly’

END

FROM towary;

Widzimy tutaj, że prócz nowych słów WHEN, THEN, END – mamy podobną sytuację jak w przypadku DECODE – osiągnęliśmy to samo.

Można zapytać po co nam w takim razie CASE? Otóż bywa mnóstwo sytuacji kiedy nie da się jej zastąpić przez DECODE ponieważ nie osiągniemy zadanego wyniku lub tez mamy zbyt wiele zmiennych.

Oto prosty przykład:

SELECT tow_nazwa

,CASE

WHEN tow_podatek IS NULL THEN ‚brak danych’

WHEN tow_cena > 2000 THEN ‚drogo’

WHEN tow_cena > 200 THEN ‚srednio’

ELSE ‚tanio’

END

FROM towary t;

Spróbujcie to samo zrobić z DECODE :) nie ma szans :)

* Ważne jest też, że CASE NIE ROZUMIE ‚NULL’ – ale rozumie IS NULL – wiem, głupie ale nie zgłębiłem jeszcze powodu dla czego taki a nie inny mechanizm tu działa.

To tyle z funkcji wbudowanych – mam nadzieję, że się przyda taka lekcja.

Zwróćcie także uwagę na zapisy tych kodów – użyłem tam specjalnie pewnych znaków w pewnych miejscach – ktoś wie czemu? :D

Możesz zostawić komentarz lub wysłać sygnał trackback ze swojego bloga.

Zostaw odpowiedź

Subskrybuj kanał RSS Follow me on Twitter!