MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Spiegazione SQL NULLIF()

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'