Blog JSystems - z miłości do programowania

Szukaj

Instrukcje warunkowe w T-SQL

SQL Server wspiera wiele rozwiązań w języku T-SQL do kontrolowania elementów podczas wykonywania kodu T-SQL. Umożliwiają one kontrolę uruchamiania w określonej kolejności lub nie uruchamiania ich w ogóle. W ich skład wchodzą między innymi takie konstrukcje jak: CASE, IF...ELSE, BEGIN...END, WHILE, BREAK, CONTINUE, RETURN i wiele innych.


IF...ELSE


Bardzo często pewnie w jakichś skryptach znajdujesz kod bardzo podobny do poniższego:



Który w skrócie oznacza, że jeśli tabela t1 istnieje to ma zostać usunięta, natomiast w przypadku jeśli taka tabela nie istnieje to po prostu nic się nie wydarzy. Gdybyśmy wydali samo polecenie usuwające tabele która nie istnieje otrzymalibyśmy odpowiedni komunikat o błędzie.


Konstrukcja IF...ELSE używana jest do określenia działania kodu, jeśli wyrażenie po słowie IF zwróci wartość TRUE to wykonywany jest kod w tym bloku. W przypadku zwrócenia wartości FALSE lub UNKNOWN (NULL) nic się nie wydarzy. Możemy jednak uzupełnić tą konstrukcję o słowo ELSE po którym możliwe jest napisanie instrukcji która ma się jednak wykonać w przypadku wartości FALSE lub UNKNOWN.



A co w przypadku poniższych dwóch kodów?



W przypadku jeśli wyrażenie 1<>1 okaże się być prawdą, chciałbym aby taka informacja pojawiła się na konsoli oraz jako wynik zapytania select. Oczywiście powyższe wyrażenie zwraca wartość false, a mimo to zapytanie się uruchomiło i zwróciło wynik, co jest kompletną bzdurą. Stało się tak ponieważ zapytanie zostało potraktowane jako osobna instrukcja, która uruchomi się bez względu na to czy wyrażenie 1<>1 zwróci wartość true lube false.



Kod wzbogacony został o słowo kluczowe else, aby na konsoli ukazał się napis ‘fałsz’ w przypadku jeśli wyrażenie 1<>1 zwróci wartość false, jednakże uruchomienie kodu zwraca błąd.


W obu powyższych przypadkach miały być wykonane dwie instrukcje, jeśli wyrażenie 1<>1 zwróciło by wynik true, co jest konstrukcyjnie niemożliwe przy takim zapisie, gdyż możemy podać tylko jedną instrukcję jaka miałaby zostać wtedy wykonana.


Oczywiście istnieje obejście tego problemu, obie instrukcje możemy umieścić w bloku BEGIN...END. Oba poprawione kody poniżej:



W powyższym przypadku, wykonanie kodu nic nie zwraca, ponieważ obie instrukcję mają się uruchomić jedynie w przypadku jeśli wyrażenie 1<>1 zwróci wartość true.



Drugi kod również prawidłowo się wykonuje i wyświetla komunikat fałsz.


Oczywiście możemy tworzyć bardziej złożone instrukcje sterujące za pomocą zagnieżdżania konstrukcji IF...ELSE jednej w drugiej. Załóżmy że mamy jakąś zmienną i chcemy ją przebadać pod kątem tego czy jest to wartość ujemna, równa zeru ,dodania, czy też jest to wartość nieznana.



IIF


Kolejnym typem instrukcji sterującej jest funkcja IIF, która zwraca jedną z dwóch wartości w zależności od warunku logicznego, konkretnie od tego czy jest on spełniony czy też nie (lub wartość nieznana).



Jeśli warunek, który został umieszczony na pierwszej pozycji zwraca wartość true, to jest zwracana wartość z drugiej pozycji.



Jeśli jednak warunek ten nie jest spełniony, nie zwraca wartości true, to wtedy funkcja zwraca wartość z trzeciej pozycji.


Za pomocą funkcji IIF możemy również wykonać bardziej złożone instrukcje, możemy znów przebadać wartość zmiennej.



Zmienna @vLiczba nie została zainicjowana żadną wartością a więc wynosi null, czyli jest nieznana.


CHOOSE


Jeszcze innym typem instrukcji sterującej może być funkcja CHOOSE, która zwraca odpowiednią wartość z podanej listy.



Pierwszy parametr oznacza pozycję z listy, pozostałe parametry zaś stanowią tę listę.

Przyjdź do nas na szkolenie z baz danych SQL Server! Mamy szereg szkoleń w ofercie: SQL, T-SQL, tuning, administracja i wiele innych. Sprawdź dostępne szkolenia SQL Server
Zapisz się do newslettera aby otrzymywać najnowsze świeżynki pojawiające się na blogu! Zapisz się do newslettera