SQL Server posiada unikalną możliwość wykonywania w czasie rzeczywistym logiki programowej na wartościach zawartych w zapytaniu. Na podstawie tych logicznych obliczeń, możesz wygenerować różne wartości jako część zwróconego zestawu danych.
Użycie wyrażenia CASE
Jest to najłatwiejsze do osiągnięcia we wszystkich wersjach SQL Server przy użyciu instrukcji CASE
, która działa jako logiczne IF...THEN...ELSE
wyrażenie i zwraca różne wartości w zależności od wyniku.
W poniższym przykładzie chcemy zwrócić dodatkową kolumnę locale
, która określa, czy nasza książka rozgrywa się w Śródziemiu czy w zwykłej starej Ziemi.
SELECT CASE WHEN books.title = 'The Hobbit' THEN 'Middle-earth' WHEN books.primary_author = 'Tolkien' THEN 'Middle-earth' ELSE 'Earth' END AS locale, books.*FROM books
Zanim zbadamy specjalny CASE
aspekt tego stwierdzenia, usuńmy tymczasowo CASE
, aby zauważyć, że jest to niezwykle proste SELECT
oświadczenie na powierzchni:
SELECT books.*FROM books
Zbadajmy zatem, jak zbudowana jest sekcja CASE
i jakie logiczne zachowanie wykonujemy.
CASE WHEN books.title = 'The Hobbit' THEN 'Middle-earth' WHEN books.primary_author = 'Tolkien' THEN 'Middle-earth' ELSE 'Earth'END AS locale
Na początek inicjalizujemy instrukcję CASE
, a następnie określamy, w jakich warunkach (WHEN
) nasza instrukcja CASE
powinna otrzymać wynik. W tym przykładzie badamy books.title
i books.primary_author
; jeśli któreś z nich pasuje do naszego tolkienowskiego tematu, THEN
zwracamy wartość 'Middle-earth.' Jeśli żadne z pól nie pasuje do naszego wyszukiwania, zamiast tego zwracamy wartość 'Earth.
Aby przeorganizować logikę jako psuedo-kod IF...THEN...ELSE
oświadczenie, po prostu prosimy SQL o ocenę:
IF title == 'The Hobbit' OR primary_author == 'Tolkien'THEN RETURN 'Middle-earth'ELSE RETURN 'Earth'END
Na koniec należy pamiętać, że instrukcja CASE
musi być zawsze dołączona na końcu z pasującą do niej instrukcją END
. W powyższym przykładzie zmieniamy również nazwę zwracanej wartości na locale
, choć jest to oczywiście opcjonalne.
Używanie funkcji IIF
Jeśli używasz bardziej nowoczesnej wersji SQL, warto wiedzieć, że SQL Server 2012 wprowadził bardzo przydatną funkcję IIF
IIF
to skrócona metoda wykonywania instrukcji IF...ELSE
CASE
i zwracania jednej z dwóch wartości, w zależności od oceny wyniku.
Restrukturyzacja naszego powyższego przykładu w celu użycia IIF
jest dość prosta.
SELECT IIF( books.title = 'The Hobbit' OR books.primary_author = 'Tolkien', 'Middle-earth', 'Earth') AS locale, books.*FROM books
W przypadku funkcji IIF
, w dużej mierze zastępujemy wiele cukru składniowego z deklaracji CASE
kilkoma prostymi przecinkami-separatorami, aby rozróżnić nasze argumenty.
Wszystko wskazuje na to, że zarówno CASE
jak i IIF
wykonują tę samą pracę, ale jeśli mamy wybór, IIF
będzie znacznie prostszy w użyciu.