W MySQL, NULLIF()
to funkcja kontroli przepływu, która zwraca NULL
jeśli oba jego argumenty są równoważne. W przeciwnym razie zwraca pierwszy argument.
Składnia
Składnia wygląda tak:
NULLIF(expr1,expr2)
Przykład
Oto przykład do zademonstrowania:
SELECT NULLIF( 7, 7 );
Wynik:
NULL
W tym przypadku oba argumenty są identyczne, więc wynikiem jest NULL
.
Kiedy argumenty nie są równoważne
Oto, co się dzieje, gdy argumenty nie są równoważne:
SELECT NULLIF( 7, 8 );
Wynik:
7
Argumenty są różne, dlatego zwracany jest pierwszy argument.
Struny
Oto przykład porównujący ciągi:
SELECT
NULLIF( 'Bean', 'Bean' ) AS "Same",
NULLIF( 'Bean', 'Mushroom' ) AS "Different";
Wynik:
Same Different ---- --------- NULL Bean
Daty
Oto przykład porównujący daty:
SELECT
NULLIF( DATE '2030-12-20', DATE '2030-12-20' ) AS "Same",
NULLIF( DATE '2030-12-20', DATE '2035-08-15' ) AS "Different";
Wynik:
Same Different ---- ---------- NULL 2030-12-20
Wyrażenia
NULLIF()
ocenia bieżącą wartość wyrażeń. Dlatego jeśli przekażemy takie wyrażenie:
SELECT NULLIF( 8, 2 * 4 );
Otrzymujemy to:
NULL
2 pomnożone przez 4 daje 8, więc oba argumenty są równoważne.
Oto, co się stanie, jeśli zmienimy drugi argument:
SELECT NULLIF( 8, 2 * 3 );
Wynik:
8
Zwracany jest pierwszy argument.
Przykład bazy danych
Załóżmy, że uruchamiamy następujące zapytanie:
SELECT
Name,
LocalName
FROM country
WHERE Region = 'Southern Europe'
ORDER BY Name;
Wynik:
+-------------------------------+--------------------------------+ | Name | LocalName | +-------------------------------+--------------------------------+ | Albania | Shqipëria | | Andorra | Andorra | | Bosnia and Herzegovina | Bosna i Hercegovina | | Croatia | Hrvatska | | Gibraltar | Gibraltar | | Greece | Elláda | | Holy See (Vatican City State) | Santa Sede/Città del Vaticano | | Italy | Italia | | Macedonia | Makedonija | | Malta | Malta | | Portugal | Portugal | | San Marino | San Marino | | Slovenia | Slovenija | | Spain | España | | Yugoslavia | Jugoslavija | +-------------------------------+--------------------------------+
Tutaj mamy nazwy krajów w lewej kolumnie, a lokalną nazwę odpowiedniego kraju w prawej.
Dodajmy NULLIF()
do trzeciej kolumny naszego zapytania:
SELECT
Name,
LocalName,
NULLIF(LocalName, Name) AS "Local Name if Different"
FROM country
WHERE Region = 'Southern Europe'
ORDER BY Name;
Wynik:
+-------------------------------+--------------------------------+--------------------------------+ | Name | LocalName | Local Name if Different | +-------------------------------+--------------------------------+--------------------------------+ | Albania | Shqipëria | Shqipëria | | Andorra | Andorra | NULL | | Bosnia and Herzegovina | Bosna i Hercegovina | Bosna i Hercegovina | | Croatia | Hrvatska | Hrvatska | | Gibraltar | Gibraltar | NULL | | Greece | Elláda | Elláda | | Holy See (Vatican City State) | Santa Sede/Città del Vaticano | Santa Sede/Città del Vaticano | | Italy | Italia | Italia | | Macedonia | Makedonija | Makedonija | | Malta | Malta | NULL | | Portugal | Portugal | NULL | | San Marino | San Marino | NULL | | Slovenia | Slovenija | Slovenija | | Spain | España | España | | Yugoslavia | Jugoslavija | Jugoslavija | +-------------------------------+--------------------------------+--------------------------------+
Widzimy, że trzecia kolumna zwraca nazwę lokalną tylko wtedy, gdy jest inna niż wartość w Name
kolumna. Jeśli jest taki sam, to NULL
jest zwracany.
Możemy również użyć NULLIF()
aby filtrować wyniki naszych zapytań:
SELECT
Name,
LocalName
FROM country
WHERE Region = 'Southern Europe'
AND NULLIF(LocalName, Name) IS NOT NULL
ORDER BY Name;
Wynik:
+-------------------------------+--------------------------------+ | Name | LocalName | +-------------------------------+--------------------------------+ | Albania | Shqipëria | | Bosnia and Herzegovina | Bosna i Hercegovina | | Croatia | Hrvatska | | Greece | Elláda | | Holy See (Vatican City State) | Santa Sede/Città del Vaticano | | Italy | Italia | | Macedonia | Makedonija | | Slovenia | Slovenija | | Spain | España | | Yugoslavia | Jugoslavija | +-------------------------------+--------------------------------+
W tym przypadku zwróciliśmy tylko te wiersze, w których nazwa lokalna jest inna niż Name
kolumna.
NULLIF()
vs CASE
Poniższy kod:
NULLIF(expr1,expr2)
jest odpowiednikiem następującego CASE
wyrażenie:
CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END
Nieprawidłowa liczba parametrów
Przekazanie niewłaściwej liczby argumentów skutkuje błędem:
SELECT NULLIF( 5 );
Wynik:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'NULLIF'