MariaDB
 sql >> Database >  >> RDS >> MariaDB

Spiegazione di MariaDB NULLIF()

In MariaDB, il NULLIF() la funzione 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( 5, 5 );

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( 5, 3 );

Risultato:

5

In questo caso, viene restituito il primo argomento.

Stringhe

Ecco un esempio che confronta le stringhe:

SELECT 
    NULLIF( 'Papaya', 'Papaya' ) AS "Same",
    NULLIF( 'Papaya', 'Salad' ) AS "Different";

Risultato:

+------+-----------+
| Same | Different |
+------+-----------+
| NULL | Papaya    |
+------+-----------+

Date

Ecco un esempio che confronta le date:

SELECT 
    NULLIF( DATE '2000-10-30', DATE '2000-10-30' ) AS "Same",
    NULLIF( DATE '2000-10-30', DATE '1999-10-30' ) AS "Different";

Risultato:

+------+------------+
| Same | Different  |
+------+------------+
| NULL | 2000-10-30 |
+------+------------+

Espressioni

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

SELECT NULLIF( 10, 2 * 5 );

Otteniamo questo:

NULL

2 moltiplicato per 5 fa 10, quindi i due argomenti sono equivalenti.

Ecco cosa succede se cambiamo il secondo argomento:

SELECT NULLIF( 10, 3 * 5 );

Risultato:

10

Viene restituito il primo argomento.

Un esempio di database

Supponiamo di eseguire la seguente query:

SELECT 
    Name,
    LocalName
FROM country 
ORDER BY Name ASC
LIMIT 10;

Risultato:

+---------------------+-----------------------+
| Name                | LocalName             |
+---------------------+-----------------------+
| Afghanistan         | Afganistan/Afqanestan |
| Albania             | Shqipëria             |
| Algeria             | Al-Jaza’ir/Algérie    |
| American Samoa      | Amerika Samoa         |
| Andorra             | Andorra               |
| Angola              | Angola                |
| Anguilla            | Anguilla              |
| Antarctica          | –                     |
| Antigua and Barbuda | Antigua and Barbuda   |
| Argentina           | Argentina             |
+---------------------+-----------------------+

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 Different"
FROM country 
ORDER BY Name ASC
LIMIT 10;

Risultato:

+---------------------+-----------------------+-----------------------+
| Name                | LocalName             | Local Name Different  |
+---------------------+-----------------------+-----------------------+
| Afghanistan         | Afganistan/Afqanestan | Afganistan/Afqanestan |
| Albania             | Shqipëria             | Shqipëria             |
| Algeria             | Al-Jaza’ir/Algérie    | Al-Jaza’ir/Algérie    |
| American Samoa      | Amerika Samoa         | Amerika Samoa         |
| Andorra             | Andorra               | NULL                  |
| Angola              | Angola                | NULL                  |
| Anguilla            | Anguilla              | NULL                  |
| Antarctica          | –                     | –                     |
| Antigua and Barbuda | Antigua and Barbuda   | NULL                  |
| Argentina           | Argentina             | 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.

In alternativa possiamo usare NULLIF() per filtrare i risultati delle nostre query:

SELECT 
    Name,
    LocalName
FROM country 
WHERE NULLIF(LocalName, Name) IS NOT NULL
ORDER BY Name ASC
LIMIT 10;

Risultato:

+----------------+-----------------------+
| Name           | LocalName             |
+----------------+-----------------------+
| Afghanistan    | Afganistan/Afqanestan |
| Albania        | Shqipëria             |
| Algeria        | Al-Jaza’ir/Algérie    |
| American Samoa | Amerika Samoa         |
| Antarctica     | –                     |
| Armenia        | Hajastan              |
| Austria        | Österreich            |
| Azerbaijan     | Azärbaycan            |
| Bahamas        | The Bahamas           |
| Bahrain        | Al-Bahrayn            |
+----------------+-----------------------+

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( 10 );

Risultato:

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