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.
ISNULLutilise le type de données du premier paramètre,COALESCEsuit leCASErè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
ISNULLetCOALESCE. LeISNULLla 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,COALESCEavec des paramètres non nuls est considéré commeNULL. - Validations pour
ISNULLetCOALESCEsont également différents. Par exemple, unNULLvaleur pourISNULLest converti enintmais pourCOALESCE, vous devez fournir un type de données. ISNULLne prend que deux paramètres. Par contreCOALESCEprend un nombre variable de paramètres.
Plus d'informations
Consultez la documentation de Microsoft pour plus de détails et des exemples plus complexes.