W SQL Server NULLIF()
wyrażenie sprawdza wartość dwóch określonych wyrażeń. Zwraca wartość null, jeśli są równe, w przeciwnym razie zwraca pierwsze wyrażenie.
Składnia
Składnia wygląda tak:
NULLIF ( expression , expression )
Przykład
Oto przykład do zademonstrowania:
SELECT NULLIF(3, 3);
Wynik:
NULL
Tutaj oba wyrażenia są równe, więc wynikiem jest wartość pusta.
Oto, co się dzieje, gdy wyrażenia nie są równe:
SELECT NULLIF(3, 7);
Wynik:
3
Tym razem zwracana jest pierwsza wartość.
Oto przykład, który zawiera oba wyniki:
SELECT
NULLIF(0, 0) AS a,
NULLIF(3, 3) AS b,
NULLIF(3, 0) AS c,
NULLIF(0, 3) AS d;
Wynik:
+------+------+-----+-----+ | a | b | c | d | |------+------+-----+-----| | NULL | NULL | 3 | 0 | +------+------+-----+-----+
Praktyczny przykład
Załóżmy, że mamy tabelę z następującymi danymi:
SELECT
ProductName,
ProductPrice
FROM Products;
Wynik:
+-------------------------------------+----------------+ | ProductName | ProductPrice | |-------------------------------------+----------------| | Left handed screwdriver | 25.99 | | Long Weight (blue) | 14.75 | | Long Weight (green) | 11.99 | | Smash 2000 Sledgehammer | 0.00 | | Chainsaw (includes 3 spare fingers) | 0.00 | | Straw Dog Box | NULL | | Bottomless Coffee Mugs (4 Pack) | 9.99 | | Right handed screwdriver | 25.99 | +-------------------------------------+----------------+ (8 rows affected)
I załóżmy, że chcemy dowiedzieć się, ile produktów ma dodatnią cenę. Innymi słowy, nie chcemy uwzględniać produktów, które mają cenę, zero lub wartość null.
Aby to zrobić, możemy użyć NULLIF()
w połączeniu z COUNT()
funkcja:
SELECT
COUNT(NULLIF(ProductPrice, 0.00)) AS Result
FROM Products;
Wynik:
+----------+ | Result | |----------| | 5 | +----------+ Warning: Null value is eliminated by an aggregate or other SET operation.
Otrzymujemy 5 zgodnie z oczekiwaniami, czyli dokładnie ile wierszy ma dodatnią wartość w ProductPrice
kolumna.
Działa to, ponieważ COUNT()
funkcja zlicza tylko wartości inne niż null. Konwertując wartości zerowe na null, jesteśmy w stanie zignorować te wartości w naszych obliczeniach.
Oto znowu bez NULLIF()
funkcja.
SELECT COUNT(ProductPrice) AS Result
FROM Products;
Wynik:
+----------+ | Result | |----------| | 7 | +----------+ Warning: Null value is eliminated by an aggregate or other SET operation.
Tym razem zawiera kwoty zerowe, a otrzymujemy 7. Nadal ignoruje wiersz 6, ponieważ w rzeczywistości ma on wartość null.
Kiedy pierwszym argumentem jest stała zerowa
Funkcja nie akceptuje stałej null jako pierwszego argumentu:
SELECT NULLIF(null, 3);
Wynik:
Msg 4151, Level 16, State 1, Line 1 The type of the first argument to NULLIF cannot be the NULL constant because the type of the first argument has to be known.
Jak mówi komunikat o błędzie, typ pierwszego argumentu musi być znany. Wartość zwracana przez funkcję wykorzystuje typ danych pierwszego wyrażenia, a ten błąd to odzwierciedla.
Ten błąd powinien być dość rzadki. W większości przypadków jako pierwszy argument przekażesz nazwę kolumny, a w SQL Server kolumny mają zdefiniowany typ danych. W takich przypadkach wartość null będzie faktycznie akceptowana, ponieważ SQL Server zna typ danych kolumny.
To samo można powiedzieć o zmiennych. Jeśli przekażesz zmienną, będziesz musiał zadeklarować jej typ, a zatem nie otrzymasz błędu.
Nieprawidłowa liczba argumentów
Wywołanie funkcji bez przekazywania jakichkolwiek argumentów skutkuje błędem:
SELECT NULLIF();
Wynik:
Msg 102, Level 15, State 1, Line 1 Incorrect syntax near ')'.
Przekazywanie zbyt wielu argumentów również powoduje błąd:
SELECT NULLIF(1, 2, 3);
Wynik:
Msg 102, Level 15, State 1, Line 1 Incorrect syntax near ','.