La maggior parte dei principali RDBMS supportano NULLIF()
operatore, che restituisce NULL
se entrambi i suoi argomenti sono equivalenti. Se gli argomenti non sono equivalenti, NULLIF()
restituisce il primo argomento.
NULLIF()
è una funzionalità standard SQL (è inclusa nella specifica ISO/IEC 9075).
Sintassi
La sintassi è questa:
NULLIF (V1, V2)
Questo equivale al seguente CASE
espressione:
CASE WHEN V1=V2 THEN NULL ELSE V1 END
Esempio
Ecco un esempio da dimostrare:
SELECT NULLIF( 12, 12 );
Risultato:
NULL
In questo caso, entrambi gli argomenti sono identici e quindi il risultato è NULL
.
A seconda del tuo RDBMS, l'output effettivo per i valori NULL potrebbe essere diverso. Ad esempio, quando si utilizza psql (per PostgreSQL), la stringa vuota viene emessa per impostazione predefinita ogni volta che viene restituito un valore NULL (sebbene questo possa essere modificato). È lo stesso con SQLite (e anche questo può essere modificato).
Quando gli argomenti non sono equivalenti
Ecco cosa succede quando gli argomenti non sono equivalenti:
SELECT NULLIF( 12, 13 );
Risultato:
12
Gli argomenti sono diversi e quindi viene restituito il primo argomento.
Stringhe
Ecco un esempio che confronta le stringhe:
SELECT
NULLIF( 'Gym', 'Gym' ) AS "Same",
NULLIF( 'Gym', 'Bag' ) AS "Different";
Risultato:
+------+-----------+ | Same | Different | +------+-----------+ | NULL | Gym | +------+-----------+
Date
Ecco un esempio che confronta le date:
SELECT
NULLIF( DATE '2045-11-25', DATE '2045-11-25' ) AS "Same",
NULLIF( DATE '2045-11-25', DATE '1990-08-15' ) AS "Different";
Risultato:
+------+------------+ | Same | Different | +------+------------+ | NULL | 2045-11-25 | +------+------------+
Espressioni
NULLIF()
valuta il valore corrente delle espressioni. Pertanto, se passiamo un'espressione come questa:
SELECT NULLIF( 24, 2 * 12 );
Otteniamo questo:
NULL
2 moltiplicato per 12 fa 24, quindi i due argomenti sono equivalenti.
Ecco cosa succede se cambiamo il secondo argomento:
SELECT NULLIF( 24, 3 * 12 );
Risultato:
24
Viene restituito il primo argomento.
Un esempio di database
Supponiamo di eseguire la seguente query:
SELECT
Name,
LocalName
FROM country
WHERE Region = 'South America'
ORDER BY Name;
Risultato:
+------------------+-------------------+ | 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 | +------------------+-------------------+
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 = 'South America'
ORDER BY Name;
Risultato:
+------------------+-------------------+-------------------------+ | 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 | +------------------+-------------------+-------------------------+
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 = 'South America'
AND NULLIF(LocalName, Name) IS NOT NULL
ORDER BY Name;
Risultato:
+---------------+-------------------+ | Name | LocalName | +---------------+-------------------+ | Brazil | Brasil | | French Guiana | Guyane française | | Peru | Perú/Piruw | +---------------+-------------------+
In questo caso, abbiamo restituito solo quelle righe in cui il nome locale è diverso da Name
colonna.
NULLIF()
rispetto a CASE
Come accennato, il seguente codice:
NULLIF (V1, V2)
è equivalente al seguente CASE
espressione:
CASE WHEN V1=V2 THEN NULL ELSE V1 END
Quindi è possibile utilizzare un CASE
espressione invece di NULLIF()
se lo si desidera. Il NULLIF()
La funzione è fondamentalmente una scorciatoia sintattica per il CASE
espressione.
Ad esempio, potremmo sostituire l'esempio precedente con il seguente:
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;
Risultato:
+---------------+-------------------+ | Name | LocalName | +---------------+-------------------+ | Brazil | Brasil | | French Guiana | Guyane française | | Peru | Perú/Piruw | +---------------+-------------------+
Tuttavia, il NULLIF()
la funzione è molto più concisa.
Conteggio parametri errato
Il passaggio di un numero errato di argomenti genera un errore:
SELECT NULLIF( 'One' );
Risultato in MySQL:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'NULLIF'