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.
- Avoiding Issues: Monitoring Query Pushdowns in Databricks Federated Queries - October 27, 2024
- Microsoft Fabric: Using Workspace Identity for Authentication - September 25, 2024
- Executing SQL queries from Azure DevOps using Service Connection credentials - August 28, 2024
Last comments