sql >> Database teknologi >  >> RDS >> Sqlserver

SQL Server COALESCE() Forklaret

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ølger CASE udtryk regler og returnerer datatypen værdi med den højeste prioritet.
  • NUL-værdien af ​​resultatudtrykket er forskellig for ISNULL og COALESCE . 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ære NULL .
  • Valideringer for ISNULL og COALESCE er også forskellige. For eksempel en NULL værdi for ISNULL er konverteret til int dog for COALESCE , skal du angive en datatype.
  • ISNULL tager kun to parametre. Derimod COALESCE tager et variabelt antal parametre.

Flere oplysninger

Se Microsofts dokumentation for flere detaljer og mere komplekse eksempler.


  1. Sådan opdeles en kommasepareret værdi i kolonner

  2. Sådan ændres automatisk stigningsværdi af MySQL / MariaDB-database

  3. 7 måder Microsoft Access kan hjælpe din virksomhed på

  4. Interessante ting om I STEDET FOR triggere