sql >> Database >  >> RDS >> Sqlserver

SQL Server COALESCE() uitgelegd

In SQL Server is de COALESCE() expression geeft zijn eerste niet-null-argument terug.

De manier waarop het werkt is, we geven een lijst met argumenten door aan de uitdrukking, het evalueert de argumenten in volgorde en retourneert de huidige waarde van de eerste uitdrukking die aanvankelijk niet evalueert naar NULL .

Syntaxis

De syntaxis gaat als volgt:

COALESCE ( expression [ ,...n ] )

Voorbeeld

Hier is een eenvoudig voorbeeld om te demonstreren:

SELECT COALESCE(null, 'Cat', 'Dog');

Resultaat:

Cat

In dit geval Cat was het eerste niet-NULL-argument, en dus COALESCE() heeft die waarde geretourneerd.

Uitdrukkingen

Zoals vermeld, COALESCE() retourneert de huidige waarde van de eerste expressie die aanvankelijk niet resulteert in NULL . Daarom, als we een uitdrukking als deze doorgeven:

SELECT COALESCE( null, 2 * 3 );

We krijgen dit:

6

De functie retourneert het gegevenstype van de expressie met de hoogste prioriteit voor het gegevenstype. Als alle expressies nonnullable zijn, wordt het resultaat getypt als nonnullable.

Als alle argumenten NULL zijn

Als alle argumenten NULL zijn , COALESCE() retourneert NULL . Echter, ten minste één van de null-waarden moet een getypte NULL . zijn , anders treedt er een fout op.

Met andere woorden, ze kunnen niet allemaal de NULL . zijn constante:

SELECT COALESCE( null, null );

We krijgen dit:

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.

In dit geval waren alle argumenten de NULL constant, en dus werd er een fout geretourneerd.

Hieronder is een databasevoorbeeld om een ​​scenario te demonstreren waarin COALESCE() retourneert NULL als alle argumenten NULL zijn .

Stel dat we de volgende query uitvoeren:

SELECT CustomerId, CustomerCategoryId
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1;

Resultaat:

CustomerId  CustomerCategoryId
----------- ------------------
NULL        NULL

Beide kolommen bevatten NULL waarden.

Dus als we beide kolommen doorgeven aan COALESCE() , krijgen we een resultaat van NULL :

SELECT COALESCE( CustomerId, CustomerCategoryId )
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1;

Resultaat:

NULL

Hetzelfde geldt als we een van de kolommen vervangen door de NULL constante:

SELECT COALESCE( CustomerId, null )
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1;

Resultaat:

NULL

Dus het is alleen wanneer alle argumenten zijn de NULL constant dat we een foutmelding krijgen.

Vervang NULL Resultaten met een bekende waarde

We kunnen een bekende waarde opnemen als het laatste argument om NULL-resultaten te vervangen door die bekende waarde.

De volgende query retourneert bijvoorbeeld NULL :

SELECT SUM( UnitPrice ) 
FROM Sales.SpecialDeals;

Resultaat:

NULL

In dit geval is de UnitPrice kolom bevat NULL-waarden in alle rijen, en dus was het resultaat NULL .

We kunnen COALESCE() . gebruiken zoals dit:

SELECT COALESCE( SUM( UnitPrice ), 0 )
FROM Sales.SpecialDeals;

Resultaat:

0.00

Nu wordt het NULL-resultaat vervangen door een bekende waarde (nul).

COALESCE() vs CASE

De COALESCE() uitdrukking is eigenlijk een syntactische snelkoppeling voor de CASE uitdrukking. Wanneer we de COALESCE() . gebruiken expressie, herschrijft de query-optimizer deze als een CASE uitdrukking.

Wanneer ik de volgende instructie uitvoer:

SELECT COALESCE( CustomerId, CustomerCategoryId )
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1;

De query-optimizer herschrijft het als volgt:

CASE 
WHEN [WideWorldImporters].[Sales].[SpecialDeals].[CustomerID] IS NOT NULL THEN [WideWorldImporters].[Sales].[SpecialDeals].[CustomerID] 
ELSE [WideWorldImporters].[Sales].[SpecialDeals].[CustomerCategoryID] 
END

COALESCE() vs ISNULL()

In sommige opzichten kan de COALESCE() uitdrukking is vergelijkbaar met de ISNULL() functie. Maar er zijn verschillen. In het bijzonder:

  • ISNULL() is een functie en wordt slechts eenmaal geëvalueerd. COALESCE() aan de andere kant, is een uitdrukking en kan mogelijk meerdere keren worden geëvalueerd.
  • De bepaling van het gegevenstype van de resulterende expressie is anders. ISNULL gebruikt het datatype van de eerste parameter, COALESCE volgt de CASE expressieregels en retourneert het gegevenstype van de waarde met de hoogste prioriteit.
  • De NULL-mogelijkheid van de resultaatuitdrukking is anders voor ISNULL en COALESCE . De ISNULL retourwaarde wordt altijd beschouwd als NIET NULLeerbaar (ervan uitgaande dat de geretourneerde waarde een niet-nulbare waarde is). Daarentegen COALESCE met niet-null parameters wordt beschouwd als NULL .
  • Validaties voor ISNULL en COALESCE zijn ook anders. Bijvoorbeeld een NULL waarde voor ISNULL wordt geconverteerd naar int hoewel voor COALESCE , moet u een gegevenstype opgeven.
  • ISNULL neemt slechts twee parameters in beslag. Daarentegen COALESCE heeft een variabel aantal parameters nodig.

Meer informatie

Zie de documentatie van Microsoft voor meer details en complexere voorbeelden.


  1. Voer de opdracht Insert uit en retourneer de ingevoegde Id in Sql

  2. Lijst van alle tabellen in postgresql information_schema

  3. Algemene tabeluitdrukkingen:wanneer en hoe ze te gebruiken

  4. SQuirreL SQL verbinden met Microsoft Excel