Il convient de mentionner que le traitement de type entre les deux peut aussi faire une différence (voir this related answer item (2)).
Dis une requête essaie d'utiliser un raccourci pour l'écriture de comparaison de valeur nulle:
select * from SomeTable
where IsNull(SomeNullableBitField, -1) != IsNull(SomeOtherNullableBitField, -1);
qui est différente de celle de
select * from SomeTable
where coalesce(SomeNullableBitField, -1) != coalesce(SomeOtherNullableBitField, -1);
Comme dans le premier cas, les forces IsNull() du type à un bit (donc -1 est converti en vrai) alors que le second cas va 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 existe un commentaire/lien similaire (@Martin Smith) sur la question elle-même.
La [documentation COALESCE] (http://msdn.microsoft.com/fr-fr/library/ms190349.aspx) a cette remarque: ISNULL et COALESCE bien qu'équivalents, peuvent se comporter différemment. Une expression impliquant ISNULL avec des paramètres non NULL est considérée comme NOT NULL, tandis que les expressions impliquant COALESCE avec des paramètres non NULL sont considérées comme étant NULL ... –
'ISNULL' va aussi contraindre le résultat au type de données de la première expression [ comme illustré ici] (http://haacked.com/archive/2005/01/21/difference-between-isnull-and-coalesce.aspx) –
Cet article explique assez bien les différences ... http: // sqlmag .com/t-sql/coalesce-vs-isnull –