SQL Server 2012 wprowadził nową wbudowaną funkcję logiczną SQL IIF. Jest to skrótowa forma zapisu logiki CASE lub IF-ELSE.
omówiliśmy Case Statement w SQL w moim wcześniejszym artykule. Używamy instrukcji case, aby zwrócić wynik na podstawie zdefiniowanego warunku. Jest podobny do IF..ELSE … wtedy polecenie oblicza wyrażenie i zwraca wynik. Instrukcja case jest dostępna w prawie wszystkich wersjach SQL Server.
przyjrzyjmy się tej funkcji SQL IIF w tym artykule.,
przegląd instrukcji SQL IIF
używamy następującego formatu do zapisu logiki instrukcji Case w zapytaniach SQL
SELECT CASE Expression When expression1 Then Result1 When expression2 Then Result2 … ELSE Result END
możemy napisać ten kod używając składni instrukcji SQL IIF w następujący sposób.
IIF(boolean_expression, true_value, false_value)
- Boolean_expression: pierwszy parametr w instrukcji SQL IIF jest wyrażeniem logicznym., Powinno to być poprawne wyrażenie logiczne w przeciwnym razie otrzymamy wyjątek
- True_Value: jeśli wyrażenie logiczne jest prawdziwe, Zwraca wartość określoną w parametrze true_value
- False_Value: jeśli wyrażenie logiczne jest fałszywe, Zwraca wartość określoną w parametrze false_value
zbadajmy instrukcję SQL IIF używając przykładów.
przykład 1: polecenie SQL IIF do porównywania wartości całkowitych
w poniższym przykładzie podane wyrażenie logiczne zwraca False (2> 3 nie jest prawdą)., Due to this, it returns the value specified in the false_value parameter.
1
|
SELECT IIF(2 > 3, 'TRUE', 'FALSE' )
|
Similarly, if the condition is TRUE (5>3 is TRUE) so it returns the value of true_value parameter.,
1
|
SELECT IIF(5 > 3, 'TRUE', 'FALSE' )
|
Example 2: SQL IIF statement with variables
In the following example, we specified two integer variables and assigned values. We use variables for comparison in the IIF statement.,
1
2
|
DECLARE @A INT = 80, @B INT = 70
SELECT IIF(@A >= @B, 'PASS', 'FAIL' )
|
The specified condition (80>70) is TRUE, so it returns the value PASS.,
przykład 3: polecenie SQL IIF aby porównać dwa ciągi znaków
w poniższym przykładzie chcemy porównać dane ciągów za pomocą polecenia SQL IIF. Chcemy poznać osobę lubiącą na podstawie nazwy osoby.,
1
2
|
DECLARE @Person Varchar(100) = 'Raj'
SELECT IIF(@Person=’Raj',’Likes Apple',’NA')
|
We can specify multiple conditions in SQL IIF statement as well.,i>
1
2
|
DECLARE @Person Varchar(100) = 'Raj'
SELECT IIF(@Person in(’Raj', 'Mohan'),’Likes Apple',’Likes Orange')
|
The query should return Likes Orange if the person name is not in the IN clause., W poniższym przykładzie person Vinay nie istnieje w zmiennej @ Person, więc zwraca wartość dla klauzuli false.
przykład 4: zagnieżdżone polecenie SQL IIF
możemy również użyć zagnieżdżonego polecenia SQL IIF do określenia wielu warunków
w tej funkcji SQL IIF sprawdza on pierwszy warunek i jeśli warunek jest prawdziwy, Zwraca wartość. W naszym przypadku jest to FALSE (osoba Vinay nie pasuje do Raja). sprawdza drugi warunek i zwraca wyniki, jeśli jest prawdziwy.,
Jeśli żaden z warunków nie jest prawdziwy, zwraca domyślną wiadomość false.
przykład 5: polecenie SQL IIF z kolumną tabeli
w poprzednich przykładach określamy wartości bezpośrednio w instrukcji IIF lub określone dla niej zmienne. Zazwyczaj chcemy go używać z istniejącymi danymi w tabeli SQL. Możemy również użyć instrukcji IIF z kolumną tabeli.,
w poniższym przykładzie chcemy poznać nazwę dostawcy z tabeli PurchaseOrders w bazie danych WideWorldImporters.
Jeśli nazwa dostawcy nie istnieje dla określonego identyfikatora dostawcy, zwraca podaną wartość false w instrukcji SQL IIF.
przykład 6: polecenie SQL IIF z kolumną tabeli i funkcją agregującą
przykład 7: polecenie SQL IIF i typ danych pierwszeństwo
możemy mieć różne typy danych dla wyników., Jeśli mamy różne typy danych określone w Warunkach wynikowych, to SQL Server daje najwyższy priorytetowy typ danych. W poniższym przykładzie dla warunku false (11>19) wynikiem będzie argument false_value, tzn. 100. Powinna być typu danych e integer, ale otrzymujemy wyjście 40.0, ponieważ drugi argument float (2.6) ma wysoki priorytet niż liczba całkowita.,
1
|
SELECT IIF(11 > 19, 2.6, 40)
|
You can check the data type precedence in the following image
Example 8: SQL IIF with NULL values
We should be careful in NULL values inside the SQL IIF function.,
1
2
3
|
SELECT
IIF(100 > 99, NULL, NULL) AS Result;
|
We cannot specify NULL in both the true and false arguments. We get the following error message.,
Msg 8133, Level 16, State 1, Line 1 przynajmniej jedno z wyrażeń wynikowych w specyfikacji przypadku musi być wyrażeniem innym niż stała NULL.
w komunikacie o błędzie widać, że podaje on informacje o specyfikacji przypadku, jednak użyliśmy funkcji SQL IIF. Przyjrzymy się temu w następnym przykładzie.
powinieneś podać przynajmniej jeden z argumentów true lub false.,
1
2
|
SELECT
IIF(100 > 99, 'Hello', NULL) AS Result;
|
The similarity between SQL IIF statement and CASE Statement
In the introduction of SQL IIF Statement, we mentioned that it is a shorthand form of writing CASE statement logic or IF-ELSE logic., Tak, to prawda. Wewnętrznie SQL Server konwertuje instrukcję na instrukcję CASE i wykonuje ją. Możemy to sprawdzić za pomocą rzeczywistego planu wykonania zapytania.
wykonaj zapytanie z przykładu 6 z rzeczywistym planem wykonania.
w rzeczywistym planie wykonania spójrz na właściwości Skalaru obliczeniowego. Możesz zobaczyć, że wykonuje polecenie CASE wewnętrznie.
wnioski
w tym artykule zbadaliśmy instrukcję SQL IIF, która jest nowym sposobem pisania warunków związanych z CASE statement., Jest on dostępny od SQL 2012 począwszy. Powinieneś to zbadać, aby się z tym zapoznać. Jeśli masz jakieś uwagi lub pytania, zostaw je w komentarzach poniżej.,
- Autor
- Ostatnie posty
jest twórcą jednego z największych darmowych internetowych zbiorów artykułów na jeden temat, z jego 50-częściową serią na SQL Server Always On Availability Groups. W oparciu o swój wkład w społeczność SQL Server został wyróżniony różnymi nagrodami, w tym prestiżowym „najlepszym autorem roku” nieprzerwanie w 2020 i 2021 w sqlshack.,
Raj jest zawsze zainteresowany nowymi wyzwaniami, więc jeśli potrzebujesz pomocy Konsultacyjnej na dowolny temat poruszany w jego pismach, można do niego dotrzeć w rajendra.gupta16@gmail.,com
Zobacz wszystkie posty Rajendra Gupta
- Wykonywanie mniejszych i większych aktualizacji wersji dla AWS RDS SQL Server – 29 stycznia 2021
- wdrażanie instancji AWS RDS PostgreSQL – 27 stycznia 2021
- migracja lokalnych baz danych SQL do AWS RDS SQL Server za pomocą AWS DMS-25 stycznia 2021