75 votes

Utiliser ISNULL vs utiliser COALESCE pour vérifier une condition spécifique?

Je sais que plusieurs paramètres peuvent être transmis à COALESCE, mais pour traiter une condition spécifique, c’est-à-dire lorsque vous souhaitez vérifier une seule expression pour voir si elle n’existe pas, utilisez-vous une valeur par défaut ou une meilleure? pratique à utiliser ISNULL à la place?

Y a-t-il un gain de performance entre les deux?

58voto

onedaywhen Points 24594

Ce problème signalé sur MIcrosoft Connect révèle quelques différences entre COALESCE et ISNULL:

une première partie de notre traitement réécrit COALESCE( expression1, expression2 ) comme CASE WHEN expression1 IS NOT NULL THEN expression1 ELSE expression2 END. Dans [cet exemple]:

COALESCE ( ( SELECT Nullable
               FROM Demo
              WHERE SomeCol = 1 ), 1 )

nous produisons:

SELECT CASE
          WHEN (SELECT Nullable FROM Demo WHERE SomeCol = 1) IS NOT NULL
          THEN (SELECT Nullable FROM Demo WHERE SomeCol = 1)
          ELSE 1
       END

Les étapes ultérieures de traitement de la requête de ne pas comprendre que les deux sous-requêtes ont été à l'origine de la même expression, afin d'exécuter la sous-requête, deux fois...

Une solution de contournement, mais j'ai hate de le suggérer, c'est changer de FUSIONNER pour ISNULL, puisque ce dernier n'a pas dupliquer la sous-requête.

26voto

GolezTrol Points 54531

Je pense que non, mais COALESCE est dans le standard SQL '92 et supporté par plusieurs bases de données différentes. Si vous optez pour la portabilité, n'utilisez pas IFNULL.

12voto

otti Points 23

En COALESCE, vous pouvez avoir plusieurs expressions, où, comme en ISNULL, vous ne pouvez vérifier qu'une seule expression.

 COALESCE ( expression [ ,...n ] ) 

ISNULL ( check_expression , replacement_value )
 

9voto

crokusek Points 448

La peine de mentionner est que le type de manipulation entre les deux peut aussi faire une différence (voir cette réponse de l'élément (2)).

Dire une requête essaie d'utiliser un raccourci pour écrire null comparaison:

select * from SomeTable
 where IsNull(SomeNullableBitField, -1) != IsNull(SomeOtherNullableBitField, -1);

qui est différent de celui

select * from SomeTable
 where coalesce(SomeNullableBitField, -1) != coalesce(SomeOtherNullableBitField, -1);

Parce que dans le premier cas, le IsNull() force le type à être un peu (donc -1 est converti à la vraie), alors que le second cas sera de promouvoir à la fois à un int.

with input as 
(
  select convert(bit, 1) as BitOn,      
         convert(bit, 0) as BitOff,
         convert(bit, null) as BitNull
)
select BitOn, 
       BitOff,
       BitNull,
       IsNull(BitOn, -1) IsNullBitOn,         -- true
       IsNull(BitOff, -1) IsNullBitOff,       -- false
       IsNull(BitNull, -1) IsNullBitNull,     -- true, converts the -1 to bit
       coalesce(BitOn, -1) CoalesceBitOn,     -- 1
       coalesce(BitOff, -1) CoalesceBitOff,   -- 0       
       coalesce(BitNull, -1) CoalesceBitNull  -- -1
  from input;

Il est similaire commentaire/lien (@Martin Smith) sur la question elle-même.

2voto

James Johnson Points 29414

Lorsqu'il n'y a qu'une seule condition nulle, ISNULL aura moins de frais généraux. La différence est probablement négligeable, cependant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X