sql >> Databáze >  >> RDS >> Mysql

MySQL NULLIF() Vysvětleno

V MySQL NULLIF() je funkce řízení toku, která vrací NULL pokud jsou oba jeho argumenty ekvivalentní. Jinak vrátí první argument.

Syntaxe

Syntaxe vypadá takto:

NULLIF(expr1,expr2)

Příklad

Zde je příklad k demonstraci:

SELECT NULLIF( 7, 7 );

Výsledek:

NULL

V tomto případě jsou oba argumenty totožné, takže výsledek je NULL .

Když argumenty nejsou rovnocenné

Co se stane, když argumenty nejsou ekvivalentní:

SELECT NULLIF( 7, 8 );

Výsledek:

7

Argumenty jsou různé, a tak je vrácen první argument.

Řetězce

Zde je příklad, který porovnává řetězce:

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

Výsledek:

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

Data

Zde je příklad, který porovnává data:

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

Výsledek:

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

Výrazy

NULLIF() vyhodnotí aktuální hodnotu výrazů. Pokud tedy předáme výraz jako tento:

SELECT NULLIF( 8, 2 * 4 );

Dostáváme toto:

NULL

2 vynásobené 4 je 8, takže oba argumenty jsou ekvivalentní.

Zde je to, co se stane, pokud změníme druhý argument:

SELECT NULLIF( 8, 2 * 3 );

Výsledek:

8

Je vrácen první argument.

Příklad databáze

Předpokládejme, že spustíme následující dotaz:

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

Výsledek:

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

Zde máme v levém sloupci názvy zemí a v pravém místní název příslušné země.

Přidejme NULLIF() do třetího sloupce našeho dotazu:

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

Výsledek:

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

Vidíme, že třetí sloupec vrací místní název pouze v případě, že se liší od hodnoty v Name sloupec. Pokud je to stejné, pak NULL je vráceno.

Můžeme také použít NULLIF() pro filtrování výsledků dotazu:

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

Výsledek:

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

V tomto případě jsme vrátili pouze ty řádky, kde se místní název liší od Name sloupec.

NULLIF() vs CASE

Následující kód:

NULLIF(expr1,expr2)

je ekvivalentní následujícímu CASE výraz:

CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END

Nesprávný počet parametrů

Předání nesprávného počtu argumentů má za následek chybu:

SELECT NULLIF( 5 );

Výsledek:

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

  1. Funkce Oracle Datetime (úplný seznam)

  2. Příklady SUBTIME() – MySQL

  3. 4 způsoby, jak najít duplicitní řádky v MySQL

  4. SQLite3.Exception:Obraz disku databáze je chybný