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'