Варто зазначити, що обробка типів між ними також може змінити ситуацію (див. Відповідний пункт відповіді (2) ).
Скажімо, запит намагається використовувати ярлик для написання нульового порівняння:
select * from SomeTable
where IsNull(SomeNullableBitField, -1) != IsNull(SomeOtherNullableBitField, -1);
що відрізняється від
select * from SomeTable
where coalesce(SomeNullableBitField, -1) != coalesce(SomeOtherNullableBitField, -1);
Оскільки в першому випадку IsNull () змушує тип бути бітом (так -1 перетворюється на істинний), тоді як другий випадок буде підвищувати обидва до 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,
IsNull(BitOff, -1) IsNullBitOff,
IsNull(BitNull, -1) IsNullBitNull,
coalesce(BitOn, -1) CoalesceBitOn,
coalesce(BitOff, -1) CoalesceBitOff,
coalesce(BitNull, -1) CoalesceBitNull
from input;
Існує подібний коментар / посилання (@Martin Smith) щодо самого питання.