I MariaDB, NULLIF()
funktion 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( 5, 5 );
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( 5, 3 );
Resultat:
5
I det här fallet returneras det första argumentet.
Strängar
Här är ett exempel som jämför strängar:
SELECT
NULLIF( 'Papaya', 'Papaya' ) AS "Same",
NULLIF( 'Papaya', 'Salad' ) AS "Different";
Resultat:
+------+-----------+ | Same | Different | +------+-----------+ | NULL | Papaya | +------+-----------+
Datum
Här är ett exempel som jämför datum:
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 | +------+------------+
Uttryck
NULLIF()
utvärderar det aktuella värdet av uttrycken. Därför, om vi skickar ett uttryck som detta:
SELECT NULLIF( 10, 2 * 5 );
Vi får detta:
NULL
2 multiplicerat med 5 är 10, så de två argumenten är ekvivalenta.
Så här händer om vi ändrar det andra argumentet:
SELECT NULLIF( 10, 3 * 5 );
Resultat:
10
Det första argumentet returneras.
Ett databasexempel
Anta att vi kör följande fråga:
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 | +---------------------+-----------------------+
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 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 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 alternativt använda NULLIF()
för att filtrera våra sökresultat:
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 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( 10 );
Resultat:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'NULLIF'