V MySQL někdy nechcete, aby byly hodnoty NULL vráceny jako NULL
. Někdy chcete, aby byly hodnoty NULL vráceny s jinou hodnotou, například „N/A“, „Nepoužije se“, „Žádné“ nebo dokonce prázdný řetězec „“.
Naštěstí existuje několik způsobů, jak to udělat v MySQL.
Zde jsou čtyři:
IFNULL()
funkceCOALESCE()
funkceIF()
v kombinaci s funkcíIS NULL
(neboIS NOT NULL
) operátorCASE
výraz kombinovaný sIS NULL
(neboIS NOT NULL
) operátor
Příklady těchto možností jsou uvedeny níže.
Ukázková data
Nejprve si vezměme pár ukázkových dat:
USE Solutions; SELECT TaskCode From Tasks;
Výsledek:
+----------+ | TaskCode | +----------+ | gar123 | | NULL | | NULL | | dog456 | | NULL | | cat789 | +----------+
Máme tedy tři hodnoty NULL a tři hodnoty, které nejsou NULL.
Funkce IFNULL()
Vzhledem k jeho názvu je to pravděpodobně nejzřejmější možnost nahrazení hodnot NULL v MySQL. Tato funkce je v podstatě ekvivalentem ISNULL()
na serveru SQL.
IFNULL()
funkce umožňuje zadat dva argumenty. První argument je vrácen pouze v případě, že není NULL. Pokud je NULL, je místo toho vrácen druhý argument.
Zde je příklad použití IFNULL()
oproti našemu vzorovému souboru dat:
SELECT IFNULL(TaskCode, 'N/A') AS Result FROM Tasks;
Výsledek:
+--------+ | Result | +--------+ | gar123 | | N/A | | N/A | | dog456 | | N/A | | cat789 | +--------+
Zde jsme jednoduše nahradili hodnoty NULL za N/A
.
Funkce COALESCE()
Tato funkce je podobná funkci IFNULL()
funkce, ale trochu jiná. Tato funkce se řídí standardem ANSI SQL a je široce nasazena v různých systémech RDBMS.
Funguje to tak, že poskytnete tolik argumentů, kolik potřebujete. COALESCE()
pak vrátí první neNULL
hodnotu v seznamu nebo NULL
pokud nejsou žádné jiné než NULL
hodnoty.
Takhle:
SELECT COALESCE(TaskCode, 'N/A') AS Result FROM Tasks;
Výsledek:
+--------+ | Result | +--------+ | gar123 | | N/A | | N/A | | dog456 | | N/A | | cat789 | +--------+
Dostaneme tedy přesně stejný výsledek jako dříve.
Rozdíl oproti této funkci je však v tom, že, jak již bylo zmíněno, můžete poskytnout seznam argumentů. COALESCE()
funkce bude mít podle toho, která je první neNULL hodnota.
Můžeme tedy například přidat NULL
jako první argument a umístěte None
před N/A
a podívejte se, co se stane:
SELECT COALESCE(NULL, TaskCode, 'None', 'N/A') AS Result FROM Tasks;
Výsledek:
+--------+ | Result | +--------+ | gar123 | | None | | None | | dog456 | | None | | cat789 | +--------+
Přeskočilo první NULL
podle očekávání pak přeskočil všechny hodnoty NULL v TaskCode
před nastavením na None
. N/A
hodnota nebyla v tomto případě použita, protože None
je na prvním místě a nemá hodnotu NULL.
Funkce IF() v kombinaci s IS NULL/IS NOT NULL
IS NULL
a IS NOT NULL
operátory vám umožňují testovat hodnoty NULL a prezentovat jinou hodnotu v závislosti na výsledku.
Tyto operátory můžeme použít uvnitř IF()
funkce, takže jsou vráceny hodnoty jiné než NULL a hodnoty NULL jsou nahrazeny hodnotou dle našeho výběru.
Příklad:
SELECT IF(TaskCode IS NOT NULL, TaskCode, 'N/A') AS Result FROM Tasks;
Výsledek:
+--------+ | Result | +--------+ | gar123 | | N/A | | N/A | | dog456 | | N/A | | cat789 | +--------+
Tedy stejný výsledek jako u IFNULL()
a COALESCE()
funkce.
A samozřejmě bychom mohli vyměnit IS NOT NULL
s IS NULL
. Pokud to uděláme, budeme muset zaměnit i následující argumenty:
SELECT IF(TaskCode IS NULL, 'N/A', TaskCode) AS Result FROM Tasks;
Výraz CASE v kombinaci s IS NULL/IS NOT NULL
Dalším způsobem, jak to udělat, je použít CASE
výraz:
SELECT CASE WHEN TaskCode IS NOT NULL THEN TaskCode ELSE 'N/A' END AS Result FROM Tasks;
Výsledek:
+--------+ | Result | +--------+ | gar123 | | N/A | | N/A | | dog456 | | N/A | | cat789 | +--------+
Stejně jako v předchozím příkladu může být tento přepsán tak, aby používal IS NULL
místo IS NOT NULL
:
SELECT CASE WHEN TaskCode IS NULL THEN 'N/A' ELSE TaskCode END AS Result FROM Tasks;