SQL – Différence entre COALESCE et ISNULL?

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.

  1. 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.
  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 avec la plus haute priorité.
  3. 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.