piątek, 13 września 2013

Wyrażenie CASE w SQL (IF THEN ELSE tylko w SQL)

Wyrażenie CASE zapewnia funkcjonalność konstrukcji typu IF-THEN-ELSE w SQL.
Wynik wyrażenia CASE może być m.in. uzależniony od wartości w jednej kolumnie :

select last_name, department_id,
case department_id
when 90 then 'Zarząd'
when 60 then 'Geeki informatyczne'
else 'Inni'
end case

from employees;




W powyższym przykładzie jeśli w kolumnie department_id pojawi się wartość 90, case zwróci nam ciąg tekstowy „Zarząd”, jeśli pojawi się wartość 60 dostaniemy tekst „Geeki informatyczne”. W przypadku pojawienia się dowolnej innej wartości otrzymamy tekst „Inni”. Po wszystkich warunkach musi być zakończenie konstrukcji klauzulą „END CASE” lub samo „END”. 

Klauzula „else” nie jest konieczna. W przypadku pojawienia się innej niż 60 lub 90 wartości, dostaniemy NULL.



Na powyższym obrazku widzimy też użycie aliasu dla wyrażenia CASE. Aby można było użyć aliasu, warunki musimy zakończyć klauzulą „END”. W przypadku zastosowania klauzuli „END CASE” dostajemy błąd.


CASE nie musi opierać się na wartościach z jednej kolumny. Na poniższym przykładzie pokazuję dodanie kolumny z opisem stanowiska uzależnionym od wartości w różnych kolumnach.

select last_name, salary,department_id,manager_id, case
when manager_id is null then 'Prezes'
when department_id=90 then 'Czlonek zarządu'
when department_id=60 and salary>5000 then 'Programista Oracle :)'
when department_id=100 then 'Ci co nie chcą dać podwyżek'
else 'jacyś inni' end stanowisko
from employees;



Case działa w taki sposób, że jeśli warunek okaże się prawdziwy, nie sprawdza następnych. Widać to na przykładzie pracownika „King”. Pracuje w departamencie 90 i jednocześnie ma null w manager_id. Wyświetla się przy nim „Prezes” a nie „Członek zarządu”, ponieważ warunek pierwszy został spełniony (null w manager_id) i system nie sprawdzał kolejnego.

2 komentarze:

  1. a jak się stosuje CASE w kryteriach WHERE?

    OdpowiedzUsuń
  2. Witam,
    podpinam się pod pytanie Pana Dariusza. Czy istnieje możliwość zastosowania CASE po WHERE? Jeżeli tak, to można prosić o jakiś przykład?

    OdpowiedzUsuń