| 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-SQLCASE 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ówTransact-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ć: W postaci przeszukiwanej każde WHEN zawiera niezależny warunek logiczny. Schemat wygląda następująco: 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 wynikuWyniki 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 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 danychW 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 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. |