J'ai vu beaucoup de gens utiliser la fonction COALESCE à la place de ISNULL. Des recherches sur Internet, j'ai constaté que COALESCE est conforme à la norme ANSI. Nous avons donc un avantage: nous savons à quoi nous attendre lorsque nous l'utilisons. Cependant, ISNULL semble plus facile à lire puisqu'il semble plus clair ce que cela fait.
Je réalise aussi que ISNULL est un peu délicat, car il agit différemment sur différents serveurs de bases de données et dans différentes langues.
Dans mon esprit, tout cela se résume à un style et à des normes. Étant donné que le style est subjectif, existe-t-il une raison d'utiliser COALESCE par rapport à ISNULL (ou vice versa)? Plus précisément, existe-t-il un avantage de performance de l’un sur l’autre?
sql-server
syntax
Richard
la source
la source
COALESCE
soit évaluée deux fois.COALESCE
n’est pas intuitif;)Réponses:
COALESCE
est traduit en interne en uneCASE
expression,ISNULL
est une fonction de moteur interne.COALESCE
est une fonction standard ANSI,ISNULL
est T-SQL.Des différences de performances peuvent apparaître et se produisent lorsque le choix influe sur le plan d'exécution, mais que la différence de vitesse de la fonction brute est minime .
la source
ensuite
Enfin, et le bit amusant. Le type de données de résultat et la longueur / précision / échelle
Ce dernier bit est la raison pour laquelle ISNULL est généralement utilisé car il est plus prévisible (?) Et que COALESCE peut ajouter des conversions de type de données inattendues: d'où provient le bit "c'est plus lent"
Tous les types de données étant identiques, vous ne verrez aucune différence pratique ...
la source
Comme Mark l'a souligné, vous aurez du mal à trouver des différences de performances; Je pense que d'autres facteurs seront plus importants. Pour moi, j'utilise toujours COALESCE, et la plupart de cela a déjà été mentionné par vous ou Mark:
Vous devez également vous assurer que vous savez comment la priorité des types de données est gérée à l'aide des deux fonctions si vous l'utilisez avec des types de données / précisions différents, etc.
Remarque
Il y a une exception. Ceux-ci sont gérés différemment dans les versions actuelles de SQL Server:
La
COALESCE
variante sera en fait exécutéesome_aggregate_query
deux fois (une fois pour vérifier la valeur et une fois pour la renvoyer si non nulle), alorsISNULL
que la sous-requête ne sera exécutée qu'une fois. Je parle ici de quelques autres différences:la source