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

SQL - Différence entre COALESCE et ISNULL ?

Comparer COALESCE et ISNULL

La fonction ISNULL et l'expression COALESCE ont un objectif similaire mais peuvent se comporter différemment.

  1. Puisque ISNULL est une fonction, elle n'est évaluée qu'une seule fois. Comme décrit ci-dessus, les valeurs d'entrée pour l'expression COALESCE peuvent être évaluées plusieurs fois.
  2. 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 les règles d'expression CASE et renvoie le type de données de valeur avec la priorité la plus élevée.
  3. La capacité NULL de l'expression de résultat est différente pour ISNULL et COALESCE. La valeur de retour ISNULL est toujours considérée comme NON NULLable (en supposant que la valeur de retour est une valeur non NULL) alors que COALESCE avec des paramètres non NULL est considéré comme NULL. Ainsi, les expressions ISNULL(NULL, 1) et COALESCE(NULL, 1) bien qu'équivalentes ont des valeurs nulles différentes. Cela fait une différence si vous utilisez ces expressions dans des colonnes calculées, créez des contraintes de clé ou rendez la valeur de retour d'une UDF scalaire déterministe afin qu'elle puisse être indexée comme indiqué dans l'exemple suivant.
> USE tempdb; 
> GO

> -- This statement fails because the PRIMARY KEY cannot accept NULL values
> -- and the nullability of the COALESCE expression for col2 
> -- evaluates to NULL. 

> CREATE TABLE #Demo  (  col1 integer NULL,  col2 AS COALESCE(col1, 0) PRIMARY KEY,  col3 AS ISNULL(col1, 0)  ); 
> 
> -- This statement succeeds because the nullability of the 
> -- ISNULL function evaluates AS NOT NULL.
> 
> CREATE TABLE #Demo  (  col1 integer NULL,  col2 AS COALESCE(col1, 0), 
> col3 AS ISNULL(col1, 0) PRIMARY KEY  );

Les validations pour ISNULL et COALESCE sont également différentes. Par exemple, une valeur NULL pour ISNULL est convertie en int alors que pour COALESCE, vous devez fournir un type de données. ISNULL ne prend que 2 paramètres alors que COALESCE prend un nombre variable de paramètres.

Source :BOL