В 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 за повече подробности и по-сложни примери.