Při dotazování na databázi SQL Server mohou nastat situace, kdy nechcete, aby byly ve vaší sadě výsledků vráceny hodnoty null. A mohou nastat chvíle, kdy je budete chtít vrátit. Ale mohou také nastat situace, kdy je budete chtít vrátit, ale jako jinou hodnotu.
To je to, co ISNULL()
funkce je pro.
ISNULL()
je funkce T-SQL, která vám umožňuje nahradit NULL
se zadanou hodnotou dle vašeho výběru.
Příklad
Zde je základní dotaz, který vrací malou sadu výsledků:
SELECT TaskCode AS Result FROM Tasks;
Výsledek:
Result ------ cat123 null null pnt456 rof789 null
Vidíme, že existují tři řádky, které obsahují hodnoty null.
Pokud bychom nechtěli, aby se hodnoty null zobrazovaly jako takové, mohli bychom použít ISNULL()
nahradit null
s jinou hodnotou.
Takhle:
SELECT ISNULL(TaskCode, 'N/A') AS Result FROM Tasks;
Výsledek:
Result ------ cat123 N/A N/A pnt456 rof789 N/A
Můžeme jej také nahradit prázdným řetězcem:
SELECT ISNULL(TaskCode, '') AS Result FROM Tasks;
Výsledek:
Result ------ cat123 pnt456 rof789
Všimněte si, že ISNULL()
vyžaduje, aby druhý argument byl typu, který lze implicitně převést na datový typ prvního argumentu. Je to proto, že vrací výsledek pomocí datového typu prvního argumentu.
Zabránění mizení nulových řádků
Existují některé funkce T-SQL, kde jsou z výsledné sady odstraněny hodnoty null. V takových případech nebudou hodnoty null vráceny vůbec.
I když to může být v některých případech žádoucí výsledek, v jiných případech to může být katastrofální, v závislosti na tom, co musíte udělat s daty po jejich vrácení.
Jedním příkladem takové funkce je STRING_AGG()
. Tato funkce umožňuje vrátit sadu výsledků jako seznam s oddělovači. Však také eliminuje hodnoty null ze sady výsledků. Pokud tedy použijeme tuto funkci s výše uvedenými ukázkovými daty, skončíme se třemi výsledky namísto šesti:
SELECT STRING_AGG(TaskCode, ', ') AS Result FROM Tasks;
Výsledek:
Result ---------------------- cat123, pnt456, rof789
Takže tři řádky obsahující hodnoty null nejsou vráceny.
V mnoha případech je to perfektní výsledek, protože naše sada výsledků není přeplněná nulovými hodnotami. To však může také způsobit problémy v závislosti na tom, k čemu budou data použita.
Pokud tedy chceme zachovat řádky s hodnotami null, můžeme použít ISNULL()
chcete-li nahradit hodnoty null jinou hodnotou:
SELECT STRING_AGG(ISNULL(TaskCode, 'N/A'), ', ') AS Result FROM Tasks;
Výsledek:
Result ------------------------------------- cat123, N/A, N/A, pnt456, rof789, N/A
Funkce COALESCE()
ISNULL()
funkce funguje podobným způsobem jako COALESCE()
funkce. Výše uvedený kód bychom tedy mohli nahradit tímto:
SELECT STRING_AGG(COALESCE(TaskCode, 'N/A'), ', ') AS Result FROM Tasks;
A získáte stejný výsledek:
Result ------------------------------------- cat123, N/A, N/A, pnt456, rof789, N/A
Existují však určité rozdíly ve způsobu, jakým se tyto dvě funkce chovají. Další informace o rozdílech najdete v porovnání COALESCE()
a ISNULL()
na webu společnosti Microsoft.