MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

SQL NULLIF() expliqué

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'