La plupart des principaux SGBDR prennent en charge le NULLIF()
opérateur, qui renvoie NULL
si ses deux arguments sont équivalents. Si les arguments ne sont pas équivalents, NULLIF()
renvoie le premier argument.
NULLIF()
est une fonctionnalité standard SQL (elle est incluse dans la spécification ISO/IEC 9075).
Syntaxe
La syntaxe ressemble à ceci :
NULLIF (V1, V2)
Ceci est équivalent au CASE
suivant expression :
CASE WHEN V1=V2 THEN NULL ELSE V1 END
Exemple
Voici un exemple pour illustrer :
SELECT NULLIF( 12, 12 );
Résultat :
NULL
Dans ce cas, les deux arguments sont identiques et le résultat est donc NULL
.
Selon votre SGBDR, la sortie réelle des valeurs NULL peut être différente. Par exemple, lors de l'utilisation de psql (pour PostgreSQL), la chaîne vide est générée par défaut chaque fois qu'une valeur NULL est renvoyée (bien que cela puisse être modifié). C'est la même chose avec SQLite (et cela peut aussi être changé).
Lorsque les arguments ne sont pas équivalents
Voici ce qui se passe lorsque les arguments ne sont pas équivalents :
SELECT NULLIF( 12, 13 );
Résultat :
12
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( 'Gym', 'Gym' ) AS "Same",
NULLIF( 'Gym', 'Bag' ) AS "Different";
Résultat :
+------+-----------+ | Same | Different | +------+-----------+ | NULL | Gym | +------+-----------+
Dates
Voici un exemple qui compare les dates :
SELECT
NULLIF( DATE '2045-11-25', DATE '2045-11-25' ) AS "Same",
NULLIF( DATE '2045-11-25', DATE '1990-08-15' ) AS "Different";
Résultat :
+------+------------+ | Same | Different | +------+------------+ | NULL | 2045-11-25 | +------+------------+
Expressions
NULLIF()
évalue la valeur courante des expressions. Par conséquent, si nous passons une expression comme celle-ci :
SELECT NULLIF( 24, 2 * 12 );
Nous obtenons ceci :
NULL
2 multiplié par 12 donne 24, donc les deux arguments sont équivalents.
Voici ce qui se passe si nous modifions le deuxième argument :
SELECT NULLIF( 24, 3 * 12 );
Résultat :
24
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 = 'South America'
ORDER BY Name;
Résultat :
+------------------+-------------------+ | 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 | +------------------+-------------------+
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 = 'South America'
ORDER BY Name;
Résultat :
+------------------+-------------------+-------------------------+ | 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 | +------------------+-------------------+-------------------------+
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 = 'South America'
AND NULLIF(LocalName, Name) IS NOT NULL
ORDER BY Name;
Résultat :
+---------------+-------------------+ | Name | LocalName | +---------------+-------------------+ | Brazil | Brasil | | French Guiana | Guyane française | | Peru | Perú/Piruw | +---------------+-------------------+
Dans ce cas, nous avons renvoyé uniquement les lignes où le nom local est différent du Name
colonne.
NULLIF()
vs CASE
Comme mentionné, le code suivant :
NULLIF (V1, V2)
est équivalent au CASE
suivant expression :
CASE WHEN V1=V2 THEN NULL ELSE V1 END
Il est donc possible d'utiliser un CASE
expression au lieu de NULLIF()
si désiré. Le NULLIF()
la fonction est essentiellement un raccourci syntaxique pour le CASE
expression.
Ainsi, par exemple, nous pourrions remplacer l'exemple précédent par le suivant :
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;
Résultat :
+---------------+-------------------+ | Name | LocalName | +---------------+-------------------+ | Brazil | Brasil | | French Guiana | Guyane française | | Peru | Perú/Piruw | +---------------+-------------------+
Cependant, le NULLIF()
la fonction est beaucoup plus concise.
Nombre de paramètres incorrect
Passer le mauvais nombre d'arguments, entraîne une erreur :
SELECT NULLIF( 'One' );
Résultat dans MySQL :
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'NULLIF'