Czym jest instrukcja warunkowa IF i jak jej używać w Transact-SQL?
Jeśli uczysz się programowanie, zapewne samej instrukcji IF w Transact-SQL nie muszę Ci przedstawiać. Wstęp jednak tego wymaga. Transact-SQL IF THEN ELSE to typowa instrukcja warunkowa. Wykonuje blok kodu, jeśli warunek ujęty przed blokiem jest spełniony. Jeśli nie jest spełniony mamy do dyspozycji opcjonalny warunek ELSE. Instrukcję IF THEN ELSE w SQL Server możemy używać w T-SQL m. in. w blokach anonimowych, procedurach, funkcjach, triggerach. Składnia T-SQL If Then Else wygląda następująco:
--tomaszkenig.pl IF Boolean_expression_1 {...polecenie wykonywane, gdy warunek_1 jest spełniony - ma wartość TRUE...} [ ELSE IF Boolean_expression_2 {...polecenie wykonywane, gdy poprzedni z warunków nie jest spełniony, a bieżący jest spełniony - wszystkie powyższe warunki = FALSE...}] [ ELSE {...polecenie wykonywane, gdy żaden z powyższych warunków nie jest spełniony - wszystkie powyższe warunki = FALSE...}]
Bloki ELSE IF i ELSE są opcjonalne i nie musimy ich uzupełniać. Instrukcje T-SQL IF możemy także zagnieżdżać tworząc kilka takich instrukcji wewnątrz siebie, o czym piszę w kolejnych punktach.
Przykłady wykorzystania T-SQL IF THEN ELSE
Poniżej prosty przykład z wykorzystanie instrukcji IF w Transact-SQL. Tworzymy zmienną liczbową i przypisujemy do niej losową liczbę od 1 do 100 za pomocą funkcji ROUND i RAND. Następnie dla tej właśnie liczby wyświetlamy komunikat za pomocą polecenia PRINT informujący nas, czy liczba znajduje się w zakresie od 0 do 50, czy od 51 do 100.
--tomaszkenig.pl DECLARE @floValue float; BEGIN SET @floValue =ROUND(RAND()*100,0); IF @floValue between 0 and 50 print 'Wylosowana liczba znajduje się w zakresie 0-50. Wylosowana liczba to: ' + cast(@flovalue as varchar(max)); ELSE print 'Wylosowana liczba znajduje się w zakresie 51-100. Wylosowana liczba to: ' + cast(@flovalue as varchar(max)); END;
W składni instrukcji Transact-SQL IF ELSE możesz użyć także bloku kodu BEGIN–END. Tą samą instrukcję możemy zapisać także w ten sposób:
--tomaszkenig.pl DECLARE @floValue float; BEGIN SET @floValue =ROUND(RAND()*100,0); IF @floValue between 0 and 50 BEGIN print 'Wylosowana liczba znajduje się w zakresie 0-50. Wylosowana liczba to: ' + cast(@flovalue as varchar(max)); END ELSE BEGIN print 'Wylosowana liczba znajduje się w zakresie 51-100. Wylosowana liczba to: ' + cast(@flovalue as varchar(max)); END END;
Instrukcja IF ELSE W Transact- SQL. Zagnieżdżona instrukcja IF w Transact-SQL
Rozbudujmy poprzedni przykład. Chcemy, by instrukcja T-SQL IF mogła wskazywać 3 różne wyniki dla zakresów 0-33, 34-66 i 67-100. W jaki sposób to zrobić? Jedyne, co powinieneś zrobić to dodać instrukcję T-SQL ELSE IF z dodatkowym warunkiem. Możliwe jest także dodanie zagnieżdżonej instrukcję IF w bloku IF lub w bloku ELSE.
--tomaszkenig.pl BEGIN declare @floRandom float; declare @varText varchar(255); set @varText = 'Wylosowana liczba to: ' set @floRandom = FLOOR(RAND()*100); print 'Program do losowania liczb z przedziału od 1 do 100.' IF @floRandom < 33 print 'Wylosowana liczba jest mniejsza od 33. Wylosowana liczba to: ' + CAST(@floRandom as varchar(3)) ELSE IF @floRandom < 66 print 'Wylosowana liczba jest większa od 33 i mniejsza niż 66. Wylosowana liczba to: ' + CAST(@floRandom as varchar(3)) ELSE print 'Wylosowano liczbę większą od 66 i mniejszą niż 100. Wylosowana liczba to: ' + CAST(@floRandom as varchar(3)) END;
Kasowanie obiektów bazodanowych za pomocą instrukcji IF w T-SQL
Za pomocą instrukcji IF T-SQL możesz także sprawdzić, czy dany obiekt jak tabela, widok, funkcja, czy procedura występuję w Twojej bazie danych i w razie występowania np go skasować. W niektórych językach SQL np w Oracle występuje polecenie tworzenia obiektów z opcjonalnym kasowaniem istniejącego obiektu o tej samej nazwie. Piszemy wtedy polecenie CREATE OR REPLACE. SQL Server w każdej wersji nie posiada takich funkcjonalności. Możesz natomiast wykonać dokładnie tak samo działanie kasując obiekt, jeśli obiekt o tej nazwie istnieje. By sprawdzić, czy dany obiekt istnieje w bazie i ewentualnie go skasować stosujemy poniżej zapisaną składnię z użyciem T-SQL IF.
--tomaszkenig.pl IF OBJECT_ID('OBJECT_NAME','OBJECT_TYPE') IS NOT NULL DROP OBJECT_TYPE OBJECT_NAME;
Jak widzisz, w poleceniu wykorzystujemy funkcję OBJECT_ID, w której w pierwszym argumencie wprowadzamy nazwę obiektu, a więc np nazwę tabeli, procedury, widoku, funkcji, bazy danych itp. W drugim argumencie wprowadzamy element, którego występowanie w bazie sprawdzamy, a więc:
- table dla tabel
- view dla widoków
- procedure dla procedur
- function dla funkcji
- database dla baz danych
W instrukcji wykonywanej, gdy warunek jest spełniony kasujemy obiekt poleceniem DROP, a więc np:
- DROP TABLE
- DROP VIEW
- DROP PROCEDURE
- DROP FUNCTION
- DROP DATABASE
Poniżej przykład kasujący tabelę o nazwie tbTest. Zaraz za poleceniem kasowania tabeli możemy utworzyć tabelę o dokładnie tej samej nazwie.
--tomaszkenig.pl IF OBJECT_ID('TbTest','table') IS NOT NULL DROP TABLE TbTesT; Create table TbTest (id int identity(1,1), MyValue1 nvarchar(255), MyValue2 nvarchar(255), date datetime2 default getdate() );