Dans MySQL, NULLIF()
est une fonction de contrôle de flux qui renvoie NULL
si ses deux arguments sont équivalents. Sinon, il renvoie le premier argument.
Syntaxe
La syntaxe ressemble à ceci :
NULLIF(expr1,expr2)
Exemple
Voici un exemple pour illustrer :
SELECT NULLIF( 7, 7 );
Résultat :
NULL
Dans ce cas, les deux arguments sont identiques et le résultat est donc NULL
.
Lorsque les arguments ne sont pas équivalents
Voici ce qui se passe lorsque les arguments ne sont pas équivalents :
SELECT NULLIF( 7, 8 );
Résultat :
7
Les arguments sont différents et c'est donc le premier argument qui est renvoyé.
Chaînes
Voici un exemple qui compare des chaînes :
SELECT
NULLIF( 'Bean', 'Bean' ) AS "Same",
NULLIF( 'Bean', 'Mushroom' ) AS "Different";
Résultat :
Same Different ---- --------- NULL Bean
Dates
Voici un exemple qui compare les dates :
SELECT
NULLIF( DATE '2030-12-20', DATE '2030-12-20' ) AS "Same",
NULLIF( DATE '2030-12-20', DATE '2035-08-15' ) AS "Different";
Résultat :
Same Different ---- ---------- NULL 2030-12-20
Expressions
NULLIF()
évalue la valeur courante des expressions. Par conséquent, si nous passons une expression comme celle-ci :
SELECT NULLIF( 8, 2 * 4 );
Nous obtenons ceci :
NULL
2 multiplié par 4 donne 8, et donc les deux arguments sont équivalents.
Voici ce qui se passe si nous modifions le deuxième argument :
SELECT NULLIF( 8, 2 * 3 );
Résultat :
8
Le premier argument est renvoyé.
Un exemple de base de données
Supposons que nous lancions la requête suivante :
SELECT
Name,
LocalName
FROM country
WHERE Region = 'Southern Europe'
ORDER BY Name;
Résultat :
+-------------------------------+--------------------------------+ | 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 | +-------------------------------+--------------------------------+
Ici, nous avons les noms de pays dans la colonne de gauche et le nom local du pays respectif dans la colonne de droite.
Ajoutons NULLIF()
à une troisième colonne de notre requête :
SELECT
Name,
LocalName,
NULLIF(LocalName, Name) AS "Local Name if Different"
FROM country
WHERE Region = 'Southern Europe'
ORDER BY Name;
Résultat :
+-------------------------------+--------------------------------+--------------------------------+ | 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 | +-------------------------------+--------------------------------+--------------------------------+
Nous pouvons voir que la troisième colonne renvoie le nom local uniquement s'il est différent de la valeur dans le Name
colonne. Si c'est la même chose, alors NULL
est renvoyé.
Nous pouvons également utiliser NULLIF()
pour filtrer nos résultats de requête :
SELECT
Name,
LocalName
FROM country
WHERE Region = 'Southern Europe'
AND NULLIF(LocalName, Name) IS NOT NULL
ORDER BY Name;
Résultat :
+-------------------------------+--------------------------------+ | 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 | +-------------------------------+--------------------------------+
Dans ce cas, nous n'avons renvoyé que les lignes où le nom local est différent du Name
colonne.
NULLIF()
vs CASE
Le code suivant :
NULLIF(expr1,expr2)
est équivalent au CASE
suivant expression :
CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END
Nombre de paramètres incorrect
Passer le mauvais nombre d'arguments, entraîne une erreur :
SELECT NULLIF( 5 );
Résultat :
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'NULLIF'