sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server COALESCE() Förklarad

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öljer CASE uttryck regler och returnerar datatypen för värde med högst prioritet.
  • Nullbarheten för resultatuttrycket är annorlunda för ISNULL och COALESCE . ISNULL returvärdet anses alltid INTE NULLbart (förutsatt att returvärdet är ett icke-nullbart). DäremotCOALESCE med icke-null-parametrar anses vara NULL .
  • Valideringar för ISNULL och COALESCE är också olika. Till exempel en NULL värde för ISNULL konverteras till int dock för COALESCE måste du ange en datatyp.
  • ISNULL tar bara två parametrar. Däremot COALESCE tar ett variabelt antal parametrar.

Mer information

Se Microsofts dokumentation för mer information och mer komplexa exempel.


  1. Hur man kör ett makro från en navigeringsknapp i Microsoft Access

  2. hur startar man en app med SQLite darabase på Android Studio-emulatorn?

  3. Cloud Backup-alternativ för MySQL- och MariaDB-databaser

  4. Skapa en "Senast ändrad" kolumn i SQL Server