V SQL Server, COALESCE()
expression vrátí svůj první nenulový argument.
Funguje to tak, že výrazu předáme seznam argumentů, vyhodnotí argumenty v pořadí a vrátí aktuální hodnotu prvního výrazu, který se zpočátku nevyhodnocuje na NULL
.
Syntaxe
Syntaxe vypadá takto:
COALESCE ( expression [ ,...n ] )
Příklad
Zde je jednoduchý příklad k demonstraci:
SELECT COALESCE(null, 'Cat', 'Dog');
Výsledek:
Cat
V tomto případě Cat
byl první argument bez NULL, a tak COALESCE()
vrátil tuto hodnotu.
Výrazy
Jak již bylo zmíněno, COALESCE()
vrátí aktuální hodnotu prvního výrazu, který se zpočátku nevyhodnotí jako NULL
. Pokud tedy předáme výraz jako tento:
SELECT COALESCE( null, 2 * 3 );
Dostáváme toto:
6
Funkce vrací datový typ výrazu s nejvyšší prioritou datového typu. Pokud jsou všechny výrazy nenulovatelné, bude výsledek zapsán jako nenulovatelný.
Když jsou všechny argumenty NULL
Pokud jsou všechny argumenty NULL
, COALESCE()
vrátí NULL
. Alespoň jedna z hodnot null však musí být zadaná NULL
, jinak dojde k chybě.
Jinými slovy, všechny nemohou být NULL
konstantní:
SELECT COALESCE( null, null );
Dostáváme toto:
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.
V tomto případě byly všechny argumenty NULL
konstantní, a tak byla vrácena chyba.
Níže je uveden příklad databáze demonstrující scénář, kde COALESCE()
vrátí NULL
když jsou všechny argumenty NULL
.
Předpokládejme, že spustíme následující dotaz:
SELECT CustomerId, CustomerCategoryId
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1;
Výsledek:
CustomerId CustomerCategoryId ----------- ------------------ NULL NULL
Oba sloupce obsahují NULL
hodnoty.
Pokud tedy předáme oba sloupce COALESCE()
, dostaneme výsledek NULL
:
SELECT COALESCE( CustomerId, CustomerCategoryId )
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1;
Výsledek:
NULL
Totéž platí, pokud nahradíme jeden ze sloupců hodnotou NULL
konstantní:
SELECT COALESCE( CustomerId, null )
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1;
Výsledek:
NULL
Takže jen když vše argumenty jsou NULL
konstantní, že dostaneme chybu.
Nahradit NULL
Výsledky se známou hodnotou
Můžeme zahrnout známou hodnotu jako poslední argument, který nahradí všechny výsledky NULL touto známou hodnotou.
Například následující dotaz vrátí NULL
:
SELECT SUM( UnitPrice )
FROM Sales.SpecialDeals;
Výsledek:
NULL
V tomto případě UnitPrice
obsahuje ve všech řádcích hodnoty NULL, takže výsledek byl NULL
.
Můžeme použít COALESCE()
takhle:
SELECT COALESCE( SUM( UnitPrice ), 0 )
FROM Sales.SpecialDeals;
Výsledek:
0.00
Nyní je výsledek NULL nahrazen známou hodnotou (nula).
COALESCE()
vs CASE
COALESCE()
výraz je ve skutečnosti syntaktická zkratka pro CASE
výraz. Když použijeme COALESCE()
výraz, optimalizátor dotazů jej přepíše jako CASE
výraz.
Když spustím následující příkaz:
SELECT COALESCE( CustomerId, CustomerCategoryId )
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1;
Optimalizátor dotazů jej přepíše na následující:
CASE
WHEN [WideWorldImporters].[Sales].[SpecialDeals].[CustomerID] IS NOT NULL THEN [WideWorldImporters].[Sales].[SpecialDeals].[CustomerID]
ELSE [WideWorldImporters].[Sales].[SpecialDeals].[CustomerCategoryID]
END
COALESCE()
vs ISNULL()
V některých ohledech COALESCE()
výraz je podobný ISNULL()
funkce. Ale existují rozdíly. Konkrétně:
ISNULL()
je funkce a vyhodnocuje se pouze jednou.COALESCE()
na druhé straně je výraz a může být potenciálně vyhodnocen vícekrát.- Určení datového typu výsledného výrazu je odlišné.
ISNULL
používá datový typ prvního parametru,COALESCE
následuje zaCASE
výraz pravidla a vrátí datový typ hodnoty s nejvyšší prioritou. - Schopnost hodnoty NULL výsledného výrazu se u výrazu
ISNULL
liší aCOALESCE
.ISNULL
návratová hodnota je vždy považována za hodnotu NOT NULLable (za předpokladu, že návratová hodnota je bez možnosti null). Naproti tomuCOALESCE
s nenulovými parametry se považuje zaNULL
. - Ověření pro
ISNULL
aCOALESCE
jsou také různé. NapříkladNULL
hodnotu proISNULL
se převede naint
i když proCOALESCE
, musíte zadat typ dat. ISNULL
má pouze dva parametry. Naproti tomuCOALESCE
přebírá proměnný počet parametrů.
Další informace
Další podrobnosti a složitější příklady naleznete v dokumentaci společnosti Microsoft.