Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL NULLIF() expliqué

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'