I MariaDB er NULLIF()
funktion returnerer NULL
hvis begge dets argumenter er ækvivalente. Ellers returnerer det det første argument.
Syntaks
Syntaksen ser sådan ud:
NULLIF(expr1,expr2)
Eksempel
Her er et eksempel til demonstration:
SELECT NULLIF( 5, 5 );
Resultat:
NULL
I dette tilfælde er begge argumenter identiske, så resultatet er NULL
.
Når argumenterne ikke er ækvivalente
Her er, hvad der sker, når argumenterne ikke er ækvivalente:
SELECT NULLIF( 5, 3 );
Resultat:
5
I dette tilfælde returneres det første argument.
Strenge
Her er et eksempel, der sammenligner strenge:
SELECT
NULLIF( 'Papaya', 'Papaya' ) AS "Same",
NULLIF( 'Papaya', 'Salad' ) AS "Different";
Resultat:
+------+-----------+ | Same | Different | +------+-----------+ | NULL | Papaya | +------+-----------+
Datoer
Her er et eksempel, der sammenligner datoer:
SELECT
NULLIF( DATE '2000-10-30', DATE '2000-10-30' ) AS "Same",
NULLIF( DATE '2000-10-30', DATE '1999-10-30' ) AS "Different";
Resultat:
+------+------------+ | Same | Different | +------+------------+ | NULL | 2000-10-30 | +------+------------+
Udtryk
NULLIF()
evaluerer den aktuelle værdi af udtrykkene. Derfor, hvis vi sender et udtryk som dette:
SELECT NULLIF( 10, 2 * 5 );
Vi får dette:
NULL
2 ganget med 5 er 10, så de to argumenter er ækvivalente.
Her er, hvad der sker, hvis vi ændrer det andet argument:
SELECT NULLIF( 10, 3 * 5 );
Resultat:
10
Det første argument returneres.
Et databaseeksempel
Antag, at vi kører følgende forespørgsel:
SELECT
Name,
LocalName
FROM country
ORDER BY Name ASC
LIMIT 10;
Resultat:
+---------------------+-----------------------+ | 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 | +---------------------+-----------------------+
Her har vi landenavne i venstre kolonne, og det lokale navn for det respektive land i højre.
Lad os tilføje NULLIF()
til en tredje kolonne i vores forespørgsel:
SELECT
Name,
LocalName,
NULLIF(LocalName, Name) AS "Local Name Different"
FROM country
ORDER BY Name ASC
LIMIT 10;
Resultat:
+---------------------+-----------------------+-----------------------+ | 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 | +---------------------+-----------------------+-----------------------+
Vi kan se, at den tredje kolonne kun returnerer det lokale navn, hvis det er forskelligt fra værdien i Name
kolonne. Hvis det er det samme, så NULL
er returneret.
Vi kan alternativt bruge NULLIF()
for at filtrere vores forespørgselsresultater:
SELECT
Name,
LocalName
FROM country
WHERE NULLIF(LocalName, Name) IS NOT NULL
ORDER BY Name ASC
LIMIT 10;
Resultat:
+----------------+-----------------------+ | 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 | +----------------+-----------------------+
I dette tilfælde returnerede vi kun de rækker, hvor det lokale navn er forskelligt fra Name
kolonne.
NULLIF()
vs CASE
Følgende kode:
NULLIF(expr1,expr2)
svarer til følgende CASE
udtryk:
CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END
Forkert parameterantal
Sender det forkerte antal argumenter, resulterer det i en fejl:
SELECT NULLIF( 10 );
Resultat:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'NULLIF'