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.
ISNULLbruger datatypen for den første parameter,COALESCEfølgerCASEudtryk regler og returnerer datatypen værdi med den højeste prioritet. - NUL-værdien af resultatudtrykket er forskellig for
ISNULLogCOALESCE.ISNULLreturværdi betragtes altid som IKKE NULLbar (forudsat at returværdien er en ikke-nullbar). DerimodCOALESCEmed ikke-null-parametre anses for at væreNULL. - Valideringer for
ISNULLogCOALESCEer også forskellige. For eksempel enNULLværdi forISNULLer konverteret tilintdog forCOALESCE, skal du angive en datatype. ISNULLtager kun to parametre. DerimodCOALESCEtager et variabelt antal parametre.
Flere oplysninger
Se Microsofts dokumentation for flere detaljer og mere komplekse eksempler.