Стоит отметить, что обработка типов между ними также может иметь значение (см. этот связанный элемент ответа (2) ).
Допустим, запрос пытается использовать ярлык для записи нулевого сравнения:
select * from SomeTable
where IsNull(SomeNullableBitField, -1) != IsNull(SomeOtherNullableBitField, -1);
что отличается от
select * from SomeTable
where coalesce(SomeNullableBitField, -1) != coalesce(SomeOtherNullableBitField, -1);
Потому что в первом случае IsNull () заставляет тип быть битовым (поэтому -1 преобразуется в true), тогда как во втором случае оба преобразуются в 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;
Существует аналогичный комментарий / ссылка (@Martin Smith) на сам вопрос.