I SQL Server er COALESCE()
udtryk returnerer sit første ikke-nul-argument.
Den måde det fungerer på er, at vi sender en liste med argumenter til udtrykket, det evaluerer argumenterne i rækkefølge og returnerer den aktuelle værdi af det første udtryk, der i starten ikke evalueres til NULL
.
Syntaks
Syntaksen ser sådan ud:
COALESCE ( expression [ ,...n ] )
Eksempel
Her er et simpelt eksempel til at demonstrere:
SELECT COALESCE(null, 'Cat', 'Dog');
Resultat:
Cat
I dette tilfælde Cat
var det første ikke-NULL-argument, og så COALESCE()
returnerede den værdi.
Udtryk
Som nævnt, COALESCE()
returnerer den aktuelle værdi af det første udtryk, der oprindeligt ikke evalueres til NULL
. Derfor, hvis vi sender et udtryk som dette:
SELECT COALESCE( null, 2 * 3 );
Vi får dette:
6
Funktionen returnerer datatypen for udtrykket med den højeste datatypeprioritet. Hvis alle udtryk ikke kan nulstilles, skrives resultatet som nonnullable.
Når alle argumenter er NULL
Hvis alle argumenter er NULL
, COALESCE()
returnerer NULL
. Dog skal mindst én af null-værdierne være en indtastet NULL
, ellers opstår der en fejl.
Med andre ord kan de ikke alle være NULL
konstant:
SELECT COALESCE( null, null );
Vi får dette:
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 dette tilfælde var alle argumenter NULL
konstant, og så en fejl blev returneret.
Nedenfor er et databaseeksempel for at demonstrere et scenarie, hvor COALESCE()
returnerer NULL
når alle argumenter er NULL
.
Antag, at vi kører følgende forespørgsel:
SELECT CustomerId, CustomerCategoryId
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1;
Resultat:
CustomerId CustomerCategoryId ----------- ------------------ NULL NULL
Begge kolonner indeholder NULL
værdier.
Så hvis vi sender begge kolonner til COALESCE()
, får vi et resultat af NULL
:
SELECT COALESCE( CustomerId, CustomerCategoryId )
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1;
Resultat:
NULL
Det samme gælder, hvis vi erstatter en af kolonnerne med NULL
konstant:
SELECT COALESCE( CustomerId, null )
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1;
Resultat:
NULL
Så det er kun, når alle argumenter er NULL
konstant, at vi får en fejl.
Erstat NULL
Resultater med en kendt værdi
Vi kan inkludere en kendt værdi som det sidste argument for at erstatte alle NULL-resultater med den kendte værdi.
For eksempel returnerer følgende forespørgsel NULL
:
SELECT SUM( UnitPrice )
FROM Sales.SpecialDeals;
Resultat:
NULL
I dette tilfælde er UnitPrice
kolonne indeholder NULL-værdier i alle rækker, så resultatet blev NULL
.
Vi kan bruge COALESCE()
sådan her:
SELECT COALESCE( SUM( UnitPrice ), 0 )
FROM Sales.SpecialDeals;
Resultat:
0.00
Nu erstattes NULL-resultatet med en kendt værdi (nul).
COALESCE()
vs CASE
COALESCE()
udtryk er faktisk en syntaktisk genvej til CASE
udtryk. Når vi bruger COALESCE()
udtryk, omskriver forespørgselsoptimeringsværktøjet det som en CASE
udtryk.
Når jeg kører følgende sætning:
SELECT COALESCE( CustomerId, CustomerCategoryId )
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1;
Forespørgselsoptimeringsværktøjet omskriver det til følgende:
CASE
WHEN [WideWorldImporters].[Sales].[SpecialDeals].[CustomerID] IS NOT NULL THEN [WideWorldImporters].[Sales].[SpecialDeals].[CustomerID]
ELSE [WideWorldImporters].[Sales].[SpecialDeals].[CustomerCategoryID]
END
COALESCE()
vs ISNULL()
På nogle måder er COALESCE()
udtryk ligner ISNULL()
fungere. Men der er forskelle. Især:
ISNULL()
er en funktion og evalueres kun én gang.COALESCE()
på den anden side er et udtryk og kan potentielt evalueres flere gange.- Datatypebestemmelse af det resulterende udtryk er anderledes.
ISNULL
bruger datatypen for den første parameter,COALESCE
følgerCASE
udtryk regler og returnerer datatypen værdi med den højeste prioritet. - NUL-værdien af resultatudtrykket er forskellig for
ISNULL
ogCOALESCE
.ISNULL
returværdi betragtes altid som IKKE NULLbar (forudsat at returværdien er en ikke-nullbar). DerimodCOALESCE
med ikke-null-parametre anses for at væreNULL
. - Valideringer for
ISNULL
ogCOALESCE
er også forskellige. For eksempel enNULL
værdi forISNULL
er konverteret tilint
dog forCOALESCE
, skal du angive en datatype. ISNULL
tager kun to parametre. DerimodCOALESCE
tager et variabelt antal parametre.
Flere oplysninger
Se Microsofts dokumentation for flere detaljer og mere komplekse eksempler.