sql >> Databáze >  >> NoSQL >> MongoDB

SQL NULLIF() vysvětleno

Většina hlavních RDBMS podporuje NULLIF() operátor, který vrátí NULL pokud jsou oba jeho argumenty ekvivalentní. Pokud argumenty nejsou ekvivalentní, NULLIF() vrátí první argument.

NULLIF() je funkce standardu SQL (je zahrnuta ve specifikaci ISO/IEC 9075).

Syntaxe

Syntaxe vypadá takto:

NULLIF (V1, V2)

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

CASE WHEN V1=V2 THEN NULL ELSE V1 END

Příklad

Zde je příklad k demonstraci:

SELECT NULLIF( 12, 12 );

Výsledek:

NULL

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

V závislosti na vašem RDBMS se může skutečný výstup pro hodnoty NULL lišit. Například při použití psql (pro PostgreSQL) je ve výchozím nastavení vypsán prázdný řetězec vždy, když je vrácena hodnota NULL (ačkoli to lze změnit). Je to stejné jako s SQLite (a to lze také změnit).

Když argumenty nejsou rovnocenné

Co se stane, když argumenty nejsou ekvivalentní:

SELECT NULLIF( 12, 13 );

Výsledek:

12

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

Řetězce

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

SELECT 
    NULLIF( 'Gym', 'Gym' ) AS "Same",
    NULLIF( 'Gym', 'Bag' ) AS "Different";

Výsledek:

+------+-----------+
| Same | Different |
+------+-----------+
| NULL | Gym       |
+------+-----------+

Data

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

SELECT 
    NULLIF( DATE '2045-11-25', DATE '2045-11-25' ) AS "Same",
    NULLIF( DATE '2045-11-25', DATE '1990-08-15' ) AS "Different";

Výsledek:

+------+------------+
| Same | Different  |
+------+------------+
| NULL | 2045-11-25 |
+------+------------+

Výrazy

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

SELECT NULLIF( 24, 2 * 12 );

Dostáváme toto:

NULL

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

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

SELECT NULLIF( 24, 3 * 12 );

Výsledek:

24

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 = 'South America'
ORDER BY Name;

Výsledek:

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

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 = 'South America'
ORDER BY Name;

Výsledek:

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

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 = 'South America'
AND NULLIF(LocalName, Name) IS NOT NULL
ORDER BY Name;

Výsledek:

+---------------+-------------------+
| Name          | LocalName         |
+---------------+-------------------+
| Brazil        | Brasil            |
| French Guiana | Guyane française  |
| Peru          | Perú/Piruw        |
+---------------+-------------------+

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

NULLIF() vs CASE

Jak již bylo zmíněno, následující kód:

NULLIF (V1, V2)

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

CASE WHEN V1=V2 THEN NULL ELSE V1 END

Je tedy možné použít CASE výraz namísto NULLIF() pokud si to přejete. NULLIF() Funkce je v podstatě syntaktická zkratka pro CASE výraz.

Takže například bychom mohli předchozí příklad nahradit tímto:

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;

Výsledek:

+---------------+-------------------+
| Name          | LocalName         |
+---------------+-------------------+
| Brazil        | Brasil            |
| French Guiana | Guyane française  |
| Peru          | Perú/Piruw        |
+---------------+-------------------+

Nicméně NULLIF() funkce je mnohem stručnější.

Nesprávný počet parametrů

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

SELECT NULLIF( 'One' );

Výsledek v MySQL:

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

  1. Jak uložit pole hash v redis

  2. Vyplatí se zkrácení názvů vlastností MongoDB?

  3. Seskupení podle konkrétního prvku pole s rámcem agregace mongo

  4. Mongoose neukládá vnořený objekt