W MariaDB funkcja NULLIF()
funkcja 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( 5, 5 );
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( 5, 3 );
Wynik:
5
W takim przypadku zwracany jest pierwszy argument.
Struny
Oto przykład porównujący ciągi:
SELECT
NULLIF( 'Papaya', 'Papaya' ) AS "Same",
NULLIF( 'Papaya', 'Salad' ) AS "Different";
Wynik:
+------+-----------+ | Same | Different | +------+-----------+ | NULL | Papaya | +------+-----------+
Daty
Oto przykład porównujący daty:
SELECT
NULLIF( DATE '2000-10-30', DATE '2000-10-30' ) AS "Same",
NULLIF( DATE '2000-10-30', DATE '1999-10-30' ) AS "Different";
Wynik:
+------+------------+ | Same | Different | +------+------------+ | NULL | 2000-10-30 | +------+------------+
Wyrażenia
NULLIF()
ocenia bieżącą wartość wyrażeń. Dlatego jeśli przekażemy takie wyrażenie:
SELECT NULLIF( 10, 2 * 5 );
Otrzymujemy to:
NULL
2 pomnożone przez 5 daje 10, więc oba argumenty są równoważne.
Oto, co się stanie, jeśli zmienimy drugi argument:
SELECT NULLIF( 10, 3 * 5 );
Wynik:
10
Zwracany jest pierwszy argument.
Przykład bazy danych
Załóżmy, że uruchamiamy następujące zapytanie:
SELECT
Name,
LocalName
FROM country
ORDER BY Name ASC
LIMIT 10;
Wynik:
+---------------------+-----------------------+ | Name | LocalName | +---------------------+-----------------------+ | Afghanistan | Afganistan/Afqanestan | | Albania | Shqipëria | | Algeria | Al-Jaza’ir/Algérie | | American Samoa | Amerika Samoa | | Andorra | Andorra | | Angola | Angola | | Anguilla | Anguilla | | Antarctica | – | | Antigua and Barbuda | Antigua and Barbuda | | Argentina | Argentina | +---------------------+-----------------------+
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 Different"
FROM country
ORDER BY Name ASC
LIMIT 10;
Wynik:
+---------------------+-----------------------+-----------------------+ | Name | LocalName | Local Name Different | +---------------------+-----------------------+-----------------------+ | Afghanistan | Afganistan/Afqanestan | Afganistan/Afqanestan | | Albania | Shqipëria | Shqipëria | | Algeria | Al-Jaza’ir/Algérie | Al-Jaza’ir/Algérie | | American Samoa | Amerika Samoa | Amerika Samoa | | Andorra | Andorra | NULL | | Angola | Angola | NULL | | Anguilla | Anguilla | NULL | | Antarctica | – | – | | Antigua and Barbuda | Antigua and Barbuda | NULL | | Argentina | Argentina | NULL | +---------------------+-----------------------+-----------------------+
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.
Alternatywnie możemy użyć NULLIF()
aby filtrować wyniki naszych zapytań:
SELECT
Name,
LocalName
FROM country
WHERE NULLIF(LocalName, Name) IS NOT NULL
ORDER BY Name ASC
LIMIT 10;
Wynik:
+----------------+-----------------------+ | Name | LocalName | +----------------+-----------------------+ | Afghanistan | Afganistan/Afqanestan | | Albania | Shqipëria | | Algeria | Al-Jaza’ir/Algérie | | American Samoa | Amerika Samoa | | Antarctica | – | | Armenia | Hajastan | | Austria | Österreich | | Azerbaijan | Azärbaycan | | Bahamas | The Bahamas | | Bahrain | Al-Bahrayn | +----------------+-----------------------+
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( 10 );
Wynik:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'NULLIF'