Quelles sont les différences pratiques entre COALESCE () et ISNULL (, '')?
Lorsque vous évitez les valeurs NULL dans les concaténations SQL, laquelle est la meilleure à utiliser?
Merci!
En comparant COALESCE et ISNULL
La fonction ISNULL et l'expression COALESCE ont un but similaire mais peuvent se comporter différemment.
- Comme ISNULL est une fonction, elle est évaluée une seule fois. Comme décrit ci-dessus, les valeurs d'input pour l'expression COALESCE peuvent être évaluées 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 les règles d'expression CASE et renvoie le type de données avec la plus haute priorité.
- La NULLabilité de l'expression de résultat est différente pour ISNULL et COALESCE. La valeur de return ISNULL est toujours considérée comme NOT NULLable (en supposant que la valeur de return est non nulle) tandis que COALESCE avec des parameters non NULL est considérée comme NULL. Ainsi, les expressions ISNULL (NULL, 1) et COALESCE (NULL, 1), bien qu'équivalentes, ont des valeurs de nullité différentes. Cela fait une différence si vous utilisez ces expressions dans des colonnes calculées, en créant des contraintes de key ou en rendant déterministe la valeur de return d'une fonction UDF scalaire 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 prend seulement 2 parameters alors que COALESCE prend un nombre variable de parameters.
Source: BOL
La principale différence est que COALESCE
est ANSI-Standard, donc vous le findez également dans d'autres SGBDR, l'autre différence est que vous pouvez donner toute une list de valeurs à vérifier à COALESCE
alors que pour ISNULL
vous ne pouvez en passer qu'une seule.
Comme ISNULL
est une fonction, elle est évaluée une seule fois. Comme décrit ci-dessus, les valeurs d'input pour l'expression COALESCE
peuvent être évaluées plusieurs fois. COALESCE
traduit fondamentalement à l'expression CASE
et ISNULL
est un embedded embedded dans le moteur de database.
ISNULL
est plus rapide que COALESCE
.
MSDN
COALESCE()
peut avoir plusieurs inputs et il évaluera dans l'ordre jusqu'à ce que l'une d'entre elles ne soit pas nulle comme COALESCE(Col1, Col2, Col3, 'N/A')
. Il est recommandé d'utiliser ceci par MS au lieu de ISNULL()
ISNULL()
ne peut avoir qu'une seule input, mais il s'est avéré être légèrement plus rapide que COALESCE.