Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL Server COALESCE() expliqué

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 le CASE 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 et COALESCE . Le ISNULL 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é comme NULL .
  • Validations pour ISNULL et COALESCE sont également différents. Par exemple, un NULL valeur pour ISNULL est converti en int mais pour COALESCE , vous devez fournir un type de données.
  • ISNULL ne prend que deux paramètres. Par contre COALESCE 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.