Dans SQL Server, le COALESCE()
expression renvoie son premier argument non nul.
La façon dont cela fonctionne est, nous passons une liste d'arguments à l'expression, elle évalue les arguments dans l'ordre et renvoie la valeur actuelle de la première expression qui n'est initialement pas évaluée à NULL
.
Syntaxe
La syntaxe ressemble à ceci :
COALESCE ( expression [ ,...n ] )
Exemple
Voici un exemple simple pour illustrer :
SELECT COALESCE(null, 'Cat', 'Dog');
Résultat :
Cat
Dans ce cas, Cat
était le premier argument non NULL, et donc COALESCE()
renvoyé cette valeur.
Expressions
Comme mentionné, COALESCE()
renvoie la valeur actuelle de la première expression qui n'est initialement pas évaluée à NULL
. Par conséquent, si nous passons une expression comme celle-ci :
SELECT COALESCE( null, 2 * 3 );
Nous obtenons ceci :
6
La fonction renvoie le type de données de l'expression avec la priorité de type de données la plus élevée. Si toutes les expressions sont non nullables, le résultat est typé comme non nullable.
Lorsque tous les arguments sont NULL
Si tous les arguments sont NULL
, COALESCE()
renvoie NULL
. Cependant, au moins une des valeurs nulles doit être un NULL
typé , sinon une erreur se produit.
En d'autres termes, ils ne peuvent pas tous être NULL
constante :
SELECT COALESCE( null, null );
Nous obtenons ceci :
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.
Dans ce cas, tous les arguments étaient les NULL
constante, et donc une erreur a été renvoyée.
Vous trouverez ci-dessous un exemple de base de données pour illustrer un scénario où COALESCE()
renvoie NULL
lorsque tous les arguments sont NULL
.
Supposons que nous lancions la requête suivante :
SELECT CustomerId, CustomerCategoryId
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1;
Résultat :
CustomerId CustomerCategoryId ----------- ------------------ NULL NULL
Les deux colonnes contiennent NULL
valeurs.
Donc, si nous passons les deux colonnes à COALESCE()
, nous obtenons un résultat de NULL
:
SELECT COALESCE( CustomerId, CustomerCategoryId )
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1;
Résultat :
NULL
Il en va de même si nous remplaçons une des colonnes par le NULL
constante :
SELECT COALESCE( CustomerId, null )
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1;
Résultat :
NULL
Donc c'est seulement quand tous les arguments sont les NULL
constante que nous obtenons une erreur.
Remplacer NULL
Résultats avec une valeur connue
Nous pouvons inclure une valeur connue comme dernier argument pour remplacer tout résultat NULL par cette valeur connue.
Par exemple, la requête suivante renvoie NULL
:
SELECT SUM( UnitPrice )
FROM Sales.SpecialDeals;
Résultat :
NULL
Dans ce cas, le UnitPrice
la colonne contient des valeurs NULL dans toutes les lignes, et donc le résultat était NULL
.
Nous pouvons utiliser COALESCE()
comme ceci :
SELECT COALESCE( SUM( UnitPrice ), 0 )
FROM Sales.SpecialDeals;
Résultat :
0.00
Maintenant, le résultat NULL est remplacé par une valeur connue (zéro).
COALESCE()
vs CASE
Le COALESCE()
expression est en fait un raccourci syntaxique pour le CASE
expression. Lorsque nous utilisons le COALESCE()
expression, l'optimiseur de requête la réécrit en tant que CASE
expression.
Lorsque j'exécute l'instruction suivante :
SELECT COALESCE( CustomerId, CustomerCategoryId )
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1;
L'optimiseur de requête le réécrit comme suit :
CASE
WHEN [WideWorldImporters].[Sales].[SpecialDeals].[CustomerID] IS NOT NULL THEN [WideWorldImporters].[Sales].[SpecialDeals].[CustomerID]
ELSE [WideWorldImporters].[Sales].[SpecialDeals].[CustomerCategoryID]
END
COALESCE()
contre ISNULL()
D'une certaine manière, le COALESCE()
l'expression est similaire à ISNULL()
une fonction. Mais il y a des différences. En particulier :
ISNULL()
est une fonction et n'est évaluée qu'une seule fois.COALESCE()
d'autre part, est une expression et peut potentiellement être évaluée plusieurs fois.- La détermination du type de données de l'expression résultante est différente.
ISNULL
utilise le type de données du premier paramètre,COALESCE
suit leCASE
règles d'expression et renvoie le type de données de la valeur avec la priorité la plus élevée. - La capacité NULL de l'expression de résultat est différente pour
ISNULL
etCOALESCE
. LeISNULL
la valeur de retour est toujours considérée comme NOT NULLable (en supposant que la valeur de retour est une valeur non nullable). En revanche,COALESCE
avec des paramètres non nuls est considéré commeNULL
. - Validations pour
ISNULL
etCOALESCE
sont également différents. Par exemple, unNULL
valeur pourISNULL
est converti enint
mais pourCOALESCE
, vous devez fournir un type de données. ISNULL
ne prend que deux paramètres. Par contreCOALESCE
prend un nombre variable de paramètres.
Plus d'informations
Consultez la documentation de Microsoft pour plus de détails et des exemples plus complexes.