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.
ISNULL
använder datatypen för den första parametern,COALESCE
följerCASE
uttryck regler och returnerar datatypen för värde med högst prioritet. - Nullbarheten för resultatuttrycket är annorlunda för
ISNULL
ochCOALESCE
.ISNULL
returvärdet anses alltid INTE NULLbart (förutsatt att returvärdet är ett icke-nullbart). DäremotCOALESCE
med icke-null-parametrar anses varaNULL
. - Valideringar för
ISNULL
ochCOALESCE
är också olika. Till exempel enNULL
värde förISNULL
konverteras tillint
dock förCOALESCE
måste du ange en datatyp. ISNULL
tar bara två parametrar. DäremotCOALESCE
tar ett variabelt antal parametrar.
Mer information
Se Microsofts dokumentation för mer information och mer komplexa exempel.