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'