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 deCASE
expressieregels en retourneert het gegevenstype van de waarde met de hoogste prioriteit. - De NULL-mogelijkheid van de resultaatuitdrukking is anders voor
ISNULL
enCOALESCE
. DeISNULL
retourwaarde wordt altijd beschouwd als NIET NULLeerbaar (ervan uitgaande dat de geretourneerde waarde een niet-nulbare waarde is). DaarentegenCOALESCE
met niet-null parameters wordt beschouwd alsNULL
. - Validaties voor
ISNULL
enCOALESCE
zijn ook anders. Bijvoorbeeld eenNULL
waarde voorISNULL
wordt geconverteerd naarint
hoewel voorCOALESCE
, moet u een gegevenstype opgeven. ISNULL
neemt slechts twee parameters in beslag. DaarentegenCOALESCE
heeft een variabel aantal parameters nodig.
Meer informatie
Zie de documentatie van Microsoft voor meer details en complexere voorbeelden.