I SQL Server, COALESCE() expression returnerar sitt första icke-null-argument.
Sättet det fungerar är att vi skickar en lista med argument till uttrycket, det utvärderar argumenten i ordning och returnerar det aktuella värdet för det första uttrycket som initialt inte evalueras till NULL .
Syntax
Syntaxen ser ut så här:
COALESCE ( expression [ ,...n ] ) Exempel
Här är ett enkelt exempel att visa:
SELECT COALESCE(null, 'Cat', 'Dog'); Resultat:
Cat
I det här fallet, Cat var det första icke-NULL-argumentet, och så COALESCE() returnerade det värdet.
Uttryck
Som nämnts, COALESCE() returnerar det aktuella värdet av det första uttrycket som initialt inte utvärderas till NULL . Därför, om vi skickar ett uttryck som detta:
SELECT COALESCE( null, 2 * 3 ); Vi får detta:
6
Funktionen returnerar datatypen för uttrycket med högst datatypsprioritet. Om alla uttryck är icke-nullbara, skrivs resultatet som icke-nullbart.
När alla argument är NULL
Om alla argument är NULL , COALESCE() returnerar NULL . Minst ett av nollvärdena måste dock vara en typ NULL , annars uppstår ett fel.
Med andra ord kan de inte alla vara NULL konstant:
SELECT COALESCE( null, null ); Vi får detta:
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.
I det här fallet var alla argument NULL konstant, så ett fel returnerades.
Nedan är ett databasexempel för att demonstrera ett scenario där COALESCE() returnerar NULL när alla argument är NULL .
Anta att vi kör följande fråga:
SELECT CustomerId, CustomerCategoryId
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1; Resultat:
CustomerId CustomerCategoryId ----------- ------------------ NULL NULL
Båda kolumnerna innehåller NULL värden.
Så om vi skickar båda kolumnerna till COALESCE() , får vi ett resultat av NULL :
SELECT COALESCE( CustomerId, CustomerCategoryId )
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1; Resultat:
NULL
Detsamma gäller om vi ersätter en av kolumnerna med NULL konstant:
SELECT COALESCE( CustomerId, null )
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1; Resultat:
NULL
Så det är bara när alla argument är NULL konstant att vi får ett fel.
Ersätt NULL Resultat med ett känt värde
Vi kan inkludera ett känt värde som det sista argumentet för att ersätta alla NULL-resultat med det kända värdet.
Till exempel returnerar följande fråga NULL :
SELECT SUM( UnitPrice )
FROM Sales.SpecialDeals; Resultat:
NULL
I det här fallet, UnitPrice kolumnen innehåller NULL-värden i alla rader, så resultatet blev NULL .
Vi kan använda COALESCE() så här:
SELECT COALESCE( SUM( UnitPrice ), 0 )
FROM Sales.SpecialDeals; Resultat:
0.00
Nu ersätts NULL-resultatet med ett känt värde (noll).
COALESCE() kontra CASE
COALESCE() expression är faktiskt en syntaktisk genväg för CASE uttryck. När vi använder COALESCE() uttryck, skriver frågeoptimeraren om det som ett CASE uttryck.
När jag kör följande uttalande:
SELECT COALESCE( CustomerId, CustomerCategoryId )
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1; Frågeoptimeraren skriver om den till följande:
CASE
WHEN [WideWorldImporters].[Sales].[SpecialDeals].[CustomerID] IS NOT NULL THEN [WideWorldImporters].[Sales].[SpecialDeals].[CustomerID]
ELSE [WideWorldImporters].[Sales].[SpecialDeals].[CustomerCategoryID]
END COALESCE() kontra ISNULL()
På vissa sätt är COALESCE() uttrycket liknar ISNULL() fungera. Men det finns skillnader. I synnerhet:
ISNULL()är en funktion och utvärderas endast en gång.COALESCE()å andra sidan är ett uttryck och kan potentiellt utvärderas flera gånger.- Datatypsbestämningen av det resulterande uttrycket är annorlunda.
ISNULLanvänder datatypen för den första parametern,COALESCEföljerCASEuttryck regler och returnerar datatypen för värde med högst prioritet. - Nullbarheten för resultatuttrycket är annorlunda för
ISNULLochCOALESCE.ISNULLreturvärdet anses alltid INTE NULLbart (förutsatt att returvärdet är ett icke-nullbart). DäremotCOALESCEmed icke-null-parametrar anses varaNULL. - Valideringar för
ISNULLochCOALESCEär också olika. Till exempel enNULLvärde förISNULLkonverteras tillintdock förCOALESCEmåste du ange en datatyp. ISNULLtar bara två parametrar. DäremotCOALESCEtar ett variabelt antal parametrar.
Mer information
Se Microsofts dokumentation för mer information och mer komplexa exempel.