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'