В SQL Server, COALESCE()
изразът връща първия си ненулев аргумент.
Начинът, по който работи е, ние предаваме списък с аргументи към израза, той оценява аргументите по ред и връща текущата стойност на първия израз, който първоначално не се оценява на NULL
.
Синтаксис
Синтаксисът е така:
COALESCE ( expression [ ,...n ] )
Пример
Ето един прост пример за демонстрация:
SELECT COALESCE(null, 'Cat', 'Dog');
Резултат:
Cat
В този случай Cat
беше първият аргумент, различен от NULL, и така COALESCE()
върна тази стойност.
Изрази
Както споменахме, COALESCE()
връща текущата стойност от първия израз, който първоначално не се оценява на NULL
. Следователно, ако предадем израз като този:
SELECT COALESCE( null, 2 * 3 );
Получаваме това:
6
Функцията връща типа данни на израза с най-висок приоритет на типа данни. Ако всички изрази не могат да бъдат нулирани, резултатът се въвежда като ненулеви.
Когато всички аргументи са NULL
Ако всички аргументи са NULL
, COALESCE()
връща NULL
. Въпреки това, поне една от нулевите стойности трябва да бъде въведен NULL
, в противен случай възниква грешка.
С други думи, не могат всички да бъдат NULL
константа:
SELECT COALESCE( null, null );
Получаваме това:
Msg 4127, Level 16, State 1, Line 1 At least one of the arguments to COALESCE must be an expression that is not the NULL constant.
В този случай всички аргументи бяха NULL
константа и така беше върната грешка.
По-долу е даден пример за база данни за демонстриране на сценарий, при който COALESCE()
връща NULL
когато всички аргументи са NULL
.
Да предположим, че изпълняваме следната заявка:
SELECT CustomerId, CustomerCategoryId
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1;
Резултат:
CustomerId CustomerCategoryId ----------- ------------------ NULL NULL
И двете колони съдържат NULL
стойности.
Така че, ако предадем и двете колони на COALESCE()
, получаваме резултат от NULL
:
SELECT COALESCE( CustomerId, CustomerCategoryId )
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1;
Резултат:
NULL
Същото е вярно, ако заменим една от колоните с NULL
константа:
SELECT COALESCE( CustomerId, null )
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1;
Резултат:
NULL
Така че това е само когато всички аргументите са NULL
константа, че получаваме грешка.
Заменете NULL
Резултати с известна стойност
Можем да включим известна стойност като последен аргумент, за да заменим всички резултати NULL с тази известна стойност.
Например следната заявка връща NULL
:
SELECT SUM( UnitPrice )
FROM Sales.SpecialDeals;
Резултат:
NULL
В този случай UnitPrice
колоната съдържа NULL стойности във всички редове, така че резултатът е NULL
.
Можем да използваме COALESCE()
така:
SELECT COALESCE( SUM( UnitPrice ), 0 )
FROM Sales.SpecialDeals;
Резултат:
0.00
Сега резултатът NULL се заменя с известна стойност (нула).
COALESCE()
срещу CASE
COALESCE()
изразът всъщност е синтактичен пряк път за CASE
изразяване. Когато използваме COALESCE()
израз, оптимизаторът на заявки го пренаписва като CASE
израз.
Когато изпълня следното изявление:
SELECT COALESCE( CustomerId, CustomerCategoryId )
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1;
Оптимизаторът на заявки го пренаписва на следното:
CASE
WHEN [WideWorldImporters].[Sales].[SpecialDeals].[CustomerID] IS NOT NULL THEN [WideWorldImporters].[Sales].[SpecialDeals].[CustomerID]
ELSE [WideWorldImporters].[Sales].[SpecialDeals].[CustomerCategoryID]
END
COALESCE()
срещу ISNULL()
В някои отношения COALESCE()
изразът е подобен на ISNULL()
функция. Но има разлики. По-специално:
ISNULL()
е функция и се оценява само веднъж.COALESCE()
от друга страна, е израз и потенциално може да бъде оценен многократно.- Определянето на типа данни на резултантния израз е различно.
ISNULL
използва типа данни на първия параметър,COALESCE
следваCASE
правила за израз и връща типа данни на стойност с най-висок приоритет. - Възможността NULL на резултатния израз е различна за
ISNULL
иCOALESCE
.ISNULL
връщаната стойност винаги се счита, че НЕ НУЛЕВА (ако приемем, че връщаната стойност не може да бъде нула). За разлика от това,COALESCE
с ненулеви параметри се счита заNULL
. - Проверки за
ISNULL
иCOALESCE
също са различни. НапримерNULL
стойност заISNULL
се преобразува вint
макар и заCOALESCE
, трябва да предоставите тип данни. ISNULL
приема само два параметъра. За разлика от товаCOALESCE
приема променлив брой параметри.
Повече информация
Вижте документацията на Microsoft за повече подробности и по-сложни примери.