De flesta större RDBMS:er stöder NULLIF()
operator, som returnerar NULL
om båda dess argument är likvärdiga. Om argumenten inte är likvärdiga, NULLIF()
returnerar det första argumentet.
NULLIF()
är en SQL-standardfunktion (den ingår i ISO/IEC 9075-specifikationen).
Syntax
Syntaxen ser ut så här:
NULLIF (V1, V2)
Detta motsvarar följande CASE
uttryck:
CASE WHEN V1=V2 THEN NULL ELSE V1 END
Exempel
Här är ett exempel att visa:
SELECT NULLIF( 12, 12 );
Resultat:
NULL
I det här fallet är båda argumenten identiska och därför är resultatet NULL
.
Beroende på din RDBMS kan den faktiska utdatan för NULL-värden vara annorlunda. Till exempel, när du använder psql (för PostgreSQL), matas den tomma strängen ut som standard när ett NULL-värde returneras (även om detta kan ändras). Det är samma sak med SQLite (och detta kan också ändras).
När argumenten inte är likvärdiga
Så här händer när argumenten inte är likvärdiga:
SELECT NULLIF( 12, 13 );
Resultat:
12
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( 'Gym', 'Gym' ) AS "Same",
NULLIF( 'Gym', 'Bag' ) AS "Different";
Resultat:
+------+-----------+ | Same | Different | +------+-----------+ | NULL | Gym | +------+-----------+
Datum
Här är ett exempel som jämför datum:
SELECT
NULLIF( DATE '2045-11-25', DATE '2045-11-25' ) AS "Same",
NULLIF( DATE '2045-11-25', DATE '1990-08-15' ) AS "Different";
Resultat:
+------+------------+ | Same | Different | +------+------------+ | NULL | 2045-11-25 | +------+------------+
Uttryck
NULLIF()
utvärderar det aktuella värdet av uttrycken. Därför, om vi skickar ett uttryck som detta:
SELECT NULLIF( 24, 2 * 12 );
Vi får detta:
NULL
2 multiplicerat med 12 är 24, så de två argumenten är ekvivalenta.
Så här händer om vi ändrar det andra argumentet:
SELECT NULLIF( 24, 3 * 12 );
Resultat:
24
Det första argumentet returneras.
Ett databasexempel
Anta att vi kör följande fråga:
SELECT
Name,
LocalName
FROM country
WHERE Region = 'South America'
ORDER BY Name;
Resultat:
+------------------+-------------------+ | Name | LocalName | +------------------+-------------------+ | Argentina | Argentina | | Bolivia | Bolivia | | Brazil | Brasil | | Chile | Chile | | Colombia | Colombia | | Ecuador | Ecuador | | Falkland Islands | Falkland Islands | | French Guiana | Guyane française | | Guyana | Guyana | | Paraguay | Paraguay | | Peru | Perú/Piruw | | Suriname | Suriname | | Uruguay | Uruguay | | Venezuela | Venezuela | +------------------+-------------------+
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 = 'South America'
ORDER BY Name;
Resultat:
+------------------+-------------------+-------------------------+ | Name | LocalName | Local Name if Different | +------------------+-------------------+-------------------------+ | Argentina | Argentina | NULL | | Bolivia | Bolivia | NULL | | Brazil | Brasil | Brasil | | Chile | Chile | NULL | | Colombia | Colombia | NULL | | Ecuador | Ecuador | NULL | | Falkland Islands | Falkland Islands | NULL | | French Guiana | Guyane française | Guyane française | | Guyana | Guyana | NULL | | Paraguay | Paraguay | NULL | | Peru | Perú/Piruw | Perú/Piruw | | Suriname | Suriname | NULL | | Uruguay | Uruguay | NULL | | Venezuela | Venezuela | NULL | +------------------+-------------------+-------------------------+
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 = 'South America'
AND NULLIF(LocalName, Name) IS NOT NULL
ORDER BY Name;
Resultat:
+---------------+-------------------+ | Name | LocalName | +---------------+-------------------+ | Brazil | Brasil | | French Guiana | Guyane française | | Peru | Perú/Piruw | +---------------+-------------------+
I det här fallet returnerade vi bara de rader där det lokala namnet skiljer sig från Name
kolumn.
NULLIF()
kontra CASE
Som nämnt, följande kod:
NULLIF (V1, V2)
motsvarar följande CASE
uttryck:
CASE WHEN V1=V2 THEN NULL ELSE V1 END
Så det är möjligt att använda en CASE
uttryck istället för NULLIF()
om så önskas. NULLIF()
funktion är i grunden en syntaktisk genväg för CASE
uttryck.
Så till exempel kan vi ersätta det föregående exemplet med följande:
SELECT
Name,
LocalName
FROM country
WHERE Region = 'South America'
AND (CASE WHEN LocalName = Name THEN NULL ELSE LocalName END) IS NOT NULL
ORDER BY Name;
Resultat:
+---------------+-------------------+ | Name | LocalName | +---------------+-------------------+ | Brazil | Brasil | | French Guiana | Guyane française | | Peru | Perú/Piruw | +---------------+-------------------+
Men NULLIF()
funktion är mycket mer kortfattad.
Felaktig parameterräkning
Om du skickar fel antal argument, resulterar det i ett fel:
SELECT NULLIF( 'One' );
Resultat i MySQL:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'NULLIF'