Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL NULLIF() spiegato

In MySQL, NULLIF() è una funzione di controllo del flusso che restituisce NULL se entrambi i suoi argomenti sono equivalenti. Altrimenti restituisce il primo argomento.

Sintassi

La sintassi è questa:

NULLIF(expr1,expr2)

Esempio

Ecco un esempio da dimostrare:

SELECT NULLIF( 7, 7 );

Risultato:

NULL

In questo caso, entrambi gli argomenti sono identici e quindi il risultato è NULL .

Quando gli argomenti non sono equivalenti

Ecco cosa succede quando gli argomenti non sono equivalenti:

SELECT NULLIF( 7, 8 );

Risultato:

7

Gli argomenti sono diversi e quindi viene restituito il primo argomento.

Stringhe

Ecco un esempio che confronta le stringhe:

SELECT 
    NULLIF( 'Bean', 'Bean' ) AS "Same",
    NULLIF( 'Bean', 'Mushroom' ) AS "Different";

Risultato:

Same	Different
----    ---------
NULL	Bean

Date

Ecco un esempio che confronta le date:

SELECT 
    NULLIF( DATE '2030-12-20', DATE '2030-12-20' ) AS "Same",
    NULLIF( DATE '2030-12-20', DATE '2035-08-15' ) AS "Different";

Risultato:

Same	Different
----    ----------
NULL	2030-12-20

Espressioni

NULLIF() valuta il valore corrente delle espressioni. Pertanto, se passiamo un'espressione come questa:

SELECT NULLIF( 8, 2 * 4 );

Otteniamo questo:

NULL

2 moltiplicato per 4 fa 8, quindi i due argomenti sono equivalenti.

Ecco cosa succede se cambiamo il secondo argomento:

SELECT NULLIF( 8, 2 * 3 );

Risultato:

8

Viene restituito il primo argomento.

Un esempio di database

Supponiamo di eseguire la seguente query:

SELECT 
    Name,
    LocalName
FROM country 
WHERE Region = 'Southern Europe'
ORDER BY Name;

Risultato:

+-------------------------------+--------------------------------+
| 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                    |
+-------------------------------+--------------------------------+

Qui abbiamo i nomi dei paesi nella colonna di sinistra e il nome locale del rispettivo paese nella destra.

Aggiungiamo NULLIF() a una terza colonna della nostra query:

SELECT
    Name,
    LocalName,
    NULLIF(LocalName, Name) AS "Local Name if Different"
FROM country 
WHERE Region = 'Southern Europe'
ORDER BY Name;

Risultato:

+-------------------------------+--------------------------------+--------------------------------+
| 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                    |
+-------------------------------+--------------------------------+--------------------------------+

Possiamo vedere che la terza colonna restituisce il nome locale solo se è diverso dal valore nel Name colonna. Se è lo stesso, allora NULL viene restituito.

Possiamo anche usare NULLIF() per filtrare i risultati delle nostre query:

SELECT 
    Name,
    LocalName
FROM country 
WHERE Region = 'Southern Europe'
AND NULLIF(LocalName, Name) IS NOT NULL
ORDER BY Name;

Risultato:

+-------------------------------+--------------------------------+
| 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                    |
+-------------------------------+--------------------------------+

In questo caso, abbiamo restituito solo quelle righe in cui il nome locale è diverso da Name colonna.

NULLIF() rispetto a CASE

Il seguente codice:

NULLIF(expr1,expr2)

è equivalente al seguente CASE espressione:

CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END

Conteggio parametri errato

Il passaggio di un numero errato di argomenti genera un errore:

SELECT NULLIF( 5 );

Risultato:

ERROR 1582 (42000): Incorrect parameter count in the call to native function 'NULLIF'