I MySQL, NULLIF()
är en flödeskontrollfunktion som returnerar NULL
om båda dess argument är likvärdiga. Annars returnerar det det första argumentet.
Syntax
Syntaxen ser ut så här:
NULLIF(expr1,expr2)
Exempel
Här är ett exempel att visa:
SELECT NULLIF( 7, 7 );
Resultat:
NULL
I det här fallet är båda argumenten identiska och resultatet är därför NULL
.
När argumenten inte är likvärdiga
Så här händer när argumenten inte är likvärdiga:
SELECT NULLIF( 7, 8 );
Resultat:
7
Argumenten är olika och därför returneras det första argumentet.
Strängar
Här är ett exempel som jämför strängar:
SELECT
NULLIF( 'Bean', 'Bean' ) AS "Same",
NULLIF( 'Bean', 'Mushroom' ) AS "Different";
Resultat:
Same Different ---- --------- NULL Bean
Datum
Här är ett exempel som jämför datum:
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
Uttryck
NULLIF()
utvärderar det aktuella värdet av uttrycken. Därför, om vi skickar ett uttryck som detta:
SELECT NULLIF( 8, 2 * 4 );
Vi får detta:
NULL
2 multiplicerat med 4 är 8, så de två argumenten är ekvivalenta.
Så här händer om vi ändrar det andra argumentet:
SELECT NULLIF( 8, 2 * 3 );
Resultat:
8
Det första argumentet returneras.
Ett databasexempel
Anta att vi kör följande fråga:
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 | +-------------------------------+--------------------------------+
Här har vi landsnamn i den vänstra kolumnen och det lokala namnet för respektive land i den högra.
Låt oss lägga till NULLIF()
till en tredje kolumn i vår fråga:
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 att den tredje kolumnen endast returnerar det lokala namnet om det skiljer sig från värdet i Name
kolumn. Om det är samma, då NULL
returneras.
Vi kan också använda NULLIF()
för att filtrera våra sökresultat:
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 det här fallet returnerade vi bara de rader där det lokala namnet skiljer sig från Name
kolumn.
NULLIF()
kontra CASE
Följande kod:
NULLIF(expr1,expr2)
motsvarar följande CASE
uttryck:
CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END
Felaktig parameterräkning
Om du skickar fel antal argument, resulterar det i ett fel:
SELECT NULLIF( 5 );
Resultat:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'NULLIF'