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.