Когато отправяте заявка към база данни на SQL Server, може да има моменти, в които не искате да се връщат нулеви стойности във вашия набор от резултати. И може да има моменти, когато искате да ги върнете. Но може да има и моменти, когато искате да ги върнете, но като различна стойност.
Това е, което ISNULL()
функцията е за.
ISNULL()
е T-SQL функция, която ви позволява да замените NULL
с определена стойност по ваш избор.
Пример
Ето основна заявка, която връща малък набор от резултати:
SELECT TaskCode AS Result FROM Tasks;
Резултат:
Result ------ cat123 null null pnt456 rof789 null
Можем да видим, че има три реда, които съдържат нулеви стойности.
Ако не искаме нулевите стойности да се показват като такива, можем да използваме ISNULL()
за да замените null
с различна стойност.
Като това:
SELECT ISNULL(TaskCode, 'N/A') AS Result FROM Tasks;
Резултат:
Result ------ cat123 N/A N/A pnt456 rof789 N/A
Можем също да го заменим с празния низ:
SELECT ISNULL(TaskCode, '') AS Result FROM Tasks;
Резултат:
Result ------ cat123 pnt456 rof789
Обърнете внимание, че ISNULL()
изисква вторият аргумент да е от тип, който може да бъде имплицитно преобразуван към типа данни на първия аргумент. Това е така, защото връща резултата, използвайки типа данни на първия аргумент.
Предотвратяване на изчезването на нулеви редове
Има някои T-SQL функции, при които нулевите стойности се елиминират от набора от резултати. В такива случаи нулевите стойности изобщо няма да бъдат върнати.
Въпреки че това може да е желан резултат в някои случаи, в други случаи може да е катастрофално, в зависимост от това какво трябва да направите с данните, след като бъдат върнати.
Един пример за такава функция е STRING_AGG()
. Тази функция ви позволява да върнете резултатния набор като разделен списък. Въпреки това, той също така елиминира нулеви стойности от набора от резултати. Така че, ако използваме тази функция с горните примерни данни, ще получим три резултата вместо шест:
SELECT STRING_AGG(TaskCode, ', ') AS Result FROM Tasks;
Резултат:
Result ---------------------- cat123, pnt456, rof789
Така че трите реда, съдържащи нулеви стойности, не се връщат.
В много случаи това е перфектен резултат, тъй като нашият набор от резултати не е затрупан с нулеви стойности. Това обаче може също да причини проблеми, в зависимост от това за какво ще се използват данните.
Следователно, ако искаме да запазим редовете с нулеви стойности, можем да използваме ISNULL()
за да замените нулевите стойности с друга стойност:
SELECT STRING_AGG(ISNULL(TaskCode, 'N/A'), ', ') AS Result FROM Tasks;
Резултат:
Result ------------------------------------- cat123, N/A, N/A, pnt456, rof789, N/A
Функцията COALESCE()
ISNULL()
функцията работи по подобен начин на COALESCE()
функция. Така че можем да заменим горния код с този:
SELECT STRING_AGG(COALESCE(TaskCode, 'N/A'), ', ') AS Result FROM Tasks;
И получете същия резултат:
Result ------------------------------------- cat123, N/A, N/A, pnt456, rof789, N/A
Има обаче някои разлики в начина, по който се държат двете функции. За повече информация относно разликите, ето сравнение на COALESCE()
и ISNULL()
на уебсайта на Microsoft.