Instrukcje warunkowe CASE i IIF w TSQL

 

Artykuł ten jest częścią serii Od 0 do TSQL, którą znajdziesz tutaj.

Dzisiejszym tematem w ramach serii Od 0 do TSQL będzie instrukcja CASE  oraz funkcja IIF. Służą one do tworzenia tak zwanych instrukcji warunkowych – czym one są oraz jak ich użyć opowiem w dalszej części niniejszej publikacji.

Czasem w naszym zapytaniu chcemy dodać kolumnę, która będzie zawierała określone wartości w zależności od jakiegoś warunku np. jeżeli ktoś jest w wieku od 1 do 10 lat to przypisz mu wartość “Dziecko”, jeżeli mieści się w przedziale od 11 do 19 lat to przypisz mu wartość “Nastolatek” i tak dalej. Właśnie do implementacji tej logiki służą wymienione powyżej konstrukcje. Są one bardzo proste w użyciu co postaram się zobrazować na konkretnym przykładzie.  Ogólna składnia CASE wygląda następująco:

SELECT 
	CASE ColumnName
		WHEN Value THEN ReturnVale
		WHEN Value THEN ReturnVale
		ELSE ReturnVale
	END AS ColumnAlias
FROM 
	TableName

Gdzie jako ColumnName podstawiamy kolumnę z naszej tabeli, tam gdzie Value podstawiamy wartość jakiej oczekujemy w tej kolumnie, a w Return Value wartość jaka ma być zwracana w przypadku wystąpienia tej wartości. Możemy się również zabezpieczyć na wypadek gdy wartość w kolumnie nie będzie pasować do żadnej z podanych wartości w sekcji WHEN – wtedy możemy przypisać jej wartość z sekcji ELSE. Powyższy przypadek użycia zobrazujemy na przykładzie tabeli Employees z bazy Northwind.

SELECT 
	ProductName,
	Discontinued,
	CASE Discontinued
		WHEN 0 THEN 'No'
		ELSE
			'Yes'
	END AS IsProductContinued	
FROM 
	Products

Powyższe zapytanie sprawdza kolumnę Doscontinued i jeżeli występuje wartość 0 to zwraca słowo “No” w przeciwnym wypadku zwraca słowo “Yes”. Zapytanie to można by również zapisać w inny sposób tj. bez ELSE – w tym wypadku rezultat byłby ten sam:

SELECT 
	ProductName,
	Discontinued,
	CASE Discontinued
		WHEN 0 THEN 'No'
		WHEN 1 THEN 'Yes'
	END AS IsProductContinued	
FROM 
	Products

Istnieje jeszcze drugi sposób użycia CASE – ogólna składnia tego przypadku została przedstawiona poniżej:

SELECT 
	CASE
		WHEN expression THEN ReturnVale
		WHEN expression THEN ReturnVale
		ELSE ReturnVale
	END AS ColumnAlias
FROM 
	TableName

W tym wypadku zamiast podawać statyczne wartości w WHEN możemy podać wyrażenie. Poniższy przykład zwraca kategorię cenową produktu na podstawie ceny.

SELECT 
	ProductName,
	UnitPrice,
	CASE 
		WHEN UnitPrice<=15 THEN 'Low' WHEN UnitPrice>15 AND UnitPrice<=30 THEN 'Medium' 
WHEN UnitPrice>30 THEN 'High'
	END AS PriceCategory	
FROM 
	Products

W bardzo podobny sposób działa funkcja IIF. Zaimplementujmy powyższy przykład z kategoriami cenowym z wykorzystaniem IIF.

SELECT 
	ProductName,
	UnitPrice,
	IIF(UnitPrice<=15,'Low', IIF(UnitPrice>15 AND UnitPrice<=30,'Medium','High'
			)
		) AS PriceCategory	
FROM 
	Products

Rezultat otrzymany w wyniku wykonania powyższego zapytania jest dokładnie taki sam jak w zapytaniu z CASE. Różnica jest taka, że w tym przypadku musieliśmy zagnieździć funkcję IIF dwukrotnie co oczywiście może zmniejszać czytelność kodu. Myślę, że dobrze jest używać IIF tylko wtedy gdy mamy do dyspozycji tylko 2 możliwości, w innym wypadku lepiej używać CASE.

Jak widać użycie instrukcji warunkowych daje nam wiele możliwości w kwestii dostosowania naszych zapytań TSQL. W następnym epizodzie zapoznamy się z typami danych w SQL Server, które mają bardzo duży wpływ na nasze zapytania – ZAPRASZAM!

Spis dostępnych artykułów w ramach sesji znajdziesz tutaj.

Leave a Reply