W jaki sposób korzystać z Select CASE w SQL Server?
CASE w SQL Server to instrukcja wyboru porównywalna do instrukcji warunkowej MsSQL IIF THEN ELSE w innych językach programowania. W jaki sposób z niej skorzystać? CASE w SQL możemy wykonać na dwa sposoby. Poniżej przedstawiam schematy działania instrukcji. Pierwsza konstrukcja CASE polega na przypisaniu wyniku do wartości.
CASE wartość_lub_nazwa_kolumny
WHEN wartość_1 THEN wynik_1
WHEN wartość_2 THEN wynik_2
WHEN wartość_n THEN wynik_n
[ ELSE wynik_gdy_zaden_z_warunków_nie_jest_spełniony ]
END
Na bazie AdventureWorks możesz wykonać przykładowe działania przypisując wartość na podstawie kolumny Name w tabeli [Production].[Culture]. Nasz Case będzie tłumaczył wartości z kolumny Name na język polski. Dla wartości innych niż zdefiniowane chcemy uzyskać wartość „Inny” :
use AdventureWorks2014
go
SELECT CultureID
,Name
,ModifiedDate
,CASE a.name
when 'English' then 'Angielski'
when 'Spanish' then 'Hiszpański'
when 'French' then 'Francuski'
else 'Inny'
END AS NAZWA_POLSKA
FROM [Production].[Culture] a;
;
Druga konstrukcja CASE polega na obliczeniu wyniku na podstawie wyrażeń logicznych.
CASE
WHEN wyrażenie_logiczne_1 THEN wynik_1
WHEN wyrażenie_logiczne_2 THEN wynik_2
WHEN wyrażenie_logiczne_n THEN wynik_n
[ ELSE wynik_gdy_zaden_z_warunków_nie_jest_spełniony ]
END
Stwórzmy identyczny przykład z użyciem tej konstrukcji do tłumaczenia wartości z kolumny Name.
use AdventureWorks2014
go
SELECT CultureID
,Name
,ModifiedDate
,CASE
when a.name = 'English' then 'Angielski'
when a.name = 'Spanish' then 'Hiszpański'
when a.name = 'French' then 'Francuski'
else 'Inny'
END AS NAZWA_POLSKA
FROM [Production].[Culture] a;
Jak widzisz wynik obydwu zapytań jest taki sam. Stwórz kolejny przykład Case na bazie AdventureWork. Case na podstawie ceny w tabeli Production.Product określi jej słowny przedział np „do 50 USD”. Poniżej przykład:
USE AdventureWorks2014
GO
SELECT ProductNumber,
Name,
CASE
WHEN ListPrice = 0 THEN 'nie na sprzedaż'
WHEN ListPrice < 50 THEN 'Do $50'
WHEN ListPrice >= 50 and ListPrice < 250 THEN 'Do $250'
WHEN ListPrice >= 250 and ListPrice < 1000 THEN 'Do $1000 '
ELSE 'Powyżej $1000'
END as PRZEDZIAL_CEN
FROM Production.Product
GO
Dodam, że Case możemy stosować także w innych klauzulach niż Select. Możemy użyć Case w klauzuli WHERE, a nawet w klauzuli FROM, HAVING, czy ORDER BY o czym dowiesz się w dalszej części tego kursu SQL Server.
Źródło: Microsoft