Serwisanci dostępni teraz · czynne całą dobę, także w weekendy i świętaWarszawa i okolice · dojazd bezpłatny
Darmowa diagnoza laptopa
Darmowa diagnoza laptopa
Dojazd do klienta bezpłatnie
Dojazd do klienta bezpłatnie
Laptopy zastępcze bezpłatnie
Laptopy zastępcze bezpłatnie
Odbiór i zwrot sprzętu bezpłatnie
Odbiór i zwrot sprzętu bezpłatnie

CASE

Termin Definicja
CASE

CASE to wyrażenie warunkowe Transact-SQL zwracające różne wartości w zależności od spełnienia zdefiniowanych warunków.

CASE w języku Transact-SQL

CASE jest wyrażeniem języka Transact-SQL używanym w Microsoft SQL Server do zwracania jednej z kilku możliwych wartości. Wynik zależy od tego, czy określony warunek został spełniony. Wyrażenie może pojawić się między innymi w klauzulach SELECT, WHERE, ORDER BY, GROUP BY oraz w instrukcji UPDATE. Nie jest osobną instrukcją sterującą przebiegiem całego skryptu, lecz elementem wyrażenia obliczanego dla konkretnego wiersza lub zestawu danych.

Najczęściej CASE służy do przekształcenia wartości technicznej na opis zrozumiały dla użytkownika, przypisania rekordu do przedziału albo wyznaczenia wartości zastępczej. Przykładowo liczba reprezentująca status może zostać pokazana jako tekst, a wynik pomiaru może zostać zaklasyfikowany jako niski, prawidłowy lub wysoki. Rezultat CASE może być używany dalej w zapytaniu tak jak inne wyrażenie, dlatego konstrukcja ta często zastępuje kilka powtarzających się warunków zapisanych poza zapytaniem.

Dwie postacie konstrukcji i kolejność warunków

Transact-SQL obsługuje dwie podstawowe postacie CASE. W postaci prostej po słowie CASE podaje się wyrażenie porównywane kolejno z wartościami umieszczonymi po WHEN. Schemat ma postać: CASE kolumna WHEN wartość1 THEN wynik1 WHEN wartość2 THEN wynik2 ELSE wynik_domyslny END. Ten wariant jest przydatny wtedy, gdy wszystkie decyzje dotyczą porównania jednej kolumny lub jednego obliczonego wyrażenia z konkretnymi wartościami.

W postaci przeszukiwanej każde WHEN zawiera niezależny warunek logiczny. Schemat wygląda następująco: CASE WHEN warunek1 THEN wynik1 WHEN warunek2 THEN wynik2 ELSE wynik_domyslny END. Taki zapis umożliwia używanie operatorów porównania, operatorów logicznych, zakresów oraz sprawdzania wartości NULL za pomocą IS NULL albo IS NOT NULL. Warunki są analizowane od góry do dołu. Po znalezieniu pierwszego spełnionego WHEN zwracany jest odpowiadający mu wynik, a kolejne warunki nie decydują już o rezultacie. Z tego powodu kolejność WHEN ma znaczenie, szczególnie gdy warunki zachodzą na siebie.

Element ELSE jest opcjonalny. Jeżeli nie zostanie podany i żaden warunek nie będzie spełniony, CASE zwróci NULL. Jawne użycie ELSE zwykle ułatwia kontrolę nad przypadkami nieprzewidzianymi, ponieważ pozwala zwrócić określoną wartość, na przykład tekst „nieokreślony” albo wartość liczbową zgodną z typem wyniku. Nie należy jednak traktować ELSE jako mechanizmu naprawiającego błędne dane wejściowe. Powinien on wyraźnie określać, co ma się stać z rekordem, który nie pasuje do żadnego rozpoznanego wariantu.

Typ danych, NULL i obliczanie wyniku

Wyniki podane po THEN oraz ELSE muszą dać się połączyć w jeden typ danych. SQL Server ustala typ wyrażenia CASE zgodnie z regułami konwersji typów i z ich priorytetem. Gdy gałęzie zwracają wartości różnych typów, może dojść do niejawnej konwersji. Przykładowo połączenie wartości całkowitej z tekstem może spowodować próbę przekonwertowania tekstu na liczbę i zakończyć wykonanie zapytania błędem, jeżeli tekst nie ma poprawnej postaci liczbowej. W razie potrzeby typ wyniku należy określić świadomie za pomocą CAST albo CONVERT.

CASE nie porównuje NULL jak zwykłej wartości. W logice SQL warunek kolumna = NULL nie jest prawidłowym sposobem wykrywania braku wartości, ponieważ porównanie z NULL daje wynik UNKNOWN. Do tego celu należy użyć kolumna IS NULL lub kolumna IS NOT NULL. W postaci prostej CASE kolumna zawierająca NULL nie dopasuje się do zwykłego WHEN NULL. Jeżeli wymagane jest rozpoznanie NULL, należy zastosować przeszukiwaną postać CASE z warunkiem IS NULL.

CASE może zawierać wyrażenia obliczeniowe, funkcje oraz zagnieżdżone konstrukcje CASE. Sam fakt umieszczenia wyrażenia w gałęzi, która logicznie nie powinna zostać wybrana, nie zawsze gwarantuje pominięcie wszystkich problemów związanych z jego obliczeniem. Szczególną ostrożność trzeba zachować przy dzieleniu przez zero, konwersjach typów oraz wyrażeniach używanych razem z agregacją. Warto również pamiętać, że CASE wybiera wartość wyniku, ale nie zmienia automatycznie sposobu filtrowania wierszy przez optymalizator zapytań. Rozbudowane warunki w CASE nie zawsze są równoważne warunkom zapisanym bezpośrednio w WHERE pod względem czytelności i wydajności.

CASE w raportach, sortowaniu i modyfikacji danych

W zapytaniu SELECT CASE pozwala utworzyć kolumnę wyliczaną bez zmiany danych zapisanych w tabeli. Może na przykład przypisać opis do kodu statusu albo zwrócić inną wartość zależnie od rodzaju rekordu. W ORDER BY konstrukcja może sterować kolejnością wyników, gdy wymagane jest sortowanie według reguły biznesowej, której nie reprezentuje bezpośrednio jedna kolumna. W GROUP BY CASE umożliwia grupowanie według obliczonej klasy, pod warunkiem że wyrażenie jest zgodne z wymaganiami dotyczącymi grupowania.

CASE bywa używany z funkcjami agregującymi do warunkowego zliczania lub sumowania. Konstrukcja w rodzaju SUM(CASE WHEN warunek THEN kwota ELSE 0 END) pozwala zsumować tylko wartości spełniające określone kryterium. Z kolei COUNT(CASE WHEN warunek THEN 1 END) wykorzystuje fakt, że COUNT(expression) pomija wartości NULL. W obu przypadkach trzeba sprawdzić, czy ELSE oraz wartości NULL odpowiadają zamierzonej semantyce. Różnica między zerem a NULL może mieć wpływ na wynik sumowania, średniej oraz późniejszych obliczeń.

W instrukcji UPDATE CASE może wyznaczać nową wartość kolumny na podstawie obecnego stanu rekordu. Taką modyfikację należy poprzedzić sprawdzeniem zapytaniem SELECT, zwłaszcza gdy warunki są nakładające się albo obejmują wartości NULL. Podczas diagnostyki nieprawidłowego wyniku trzeba sprawdzić pełny zapis CASE, kolejność WHEN, typy danych wszystkich gałęzi, obecność ELSE oraz sposób interpretacji NULL. W środowisku SQL Server pomocne jest także uruchomienie zapytania na kontrolnym zestawie rekordów obejmującym wartości typowe, graniczne, brakujące i nieoczekiwane. Dzięki temu można odróżnić błąd samej logiki warunkowej od błędu danych wejściowych lub niezamierzonej konwersji typu.

+48 22 100 48 29Zadzwoń teraz · serwisant w 1 godzinę