I MySQL, NULLIF()
er en flowkontrolfunktion, der 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( 7, 7 );
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( 7, 8 );
Resultat:
7
Argumenterne er forskellige, og derfor returneres det første argument.
Strenge
Her er et eksempel, der sammenligner strenge:
SELECT
NULLIF( 'Bean', 'Bean' ) AS "Same",
NULLIF( 'Bean', 'Mushroom' ) AS "Different";
Resultat:
Same Different ---- --------- NULL Bean
Datoer
Her er et eksempel, der sammenligner datoer:
SELECT
NULLIF( DATE '2030-12-20', DATE '2030-12-20' ) AS "Same",
NULLIF( DATE '2030-12-20', DATE '2035-08-15' ) AS "Different";
Resultat:
Same Different ---- ---------- NULL 2030-12-20
Udtryk
NULLIF()
evaluerer den aktuelle værdi af udtrykkene. Derfor, hvis vi sender et udtryk som dette:
SELECT NULLIF( 8, 2 * 4 );
Vi får dette:
NULL
2 ganget med 4 er 8, så de to argumenter er ækvivalente.
Her er, hvad der sker, hvis vi ændrer det andet argument:
SELECT NULLIF( 8, 2 * 3 );
Resultat:
8
Det første argument returneres.
Et databaseeksempel
Antag, at vi kører følgende forespørgsel:
SELECT
Name,
LocalName
FROM country
WHERE Region = 'Southern Europe'
ORDER BY Name;
Resultat:
+-------------------------------+--------------------------------+ | 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 | +-------------------------------+--------------------------------+
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 if Different"
FROM country
WHERE Region = 'Southern Europe'
ORDER BY Name;
Resultat:
+-------------------------------+--------------------------------+--------------------------------+ | 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 | +-------------------------------+--------------------------------+--------------------------------+
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 også bruge NULLIF()
for at filtrere vores forespørgselsresultater:
SELECT
Name,
LocalName
FROM country
WHERE Region = 'Southern Europe'
AND NULLIF(LocalName, Name) IS NOT NULL
ORDER BY Name;
Resultat:
+-------------------------------+--------------------------------+ | 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 | +-------------------------------+--------------------------------+
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( 5 );
Resultat:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'NULLIF'