Đáng nói là việc xử lý loại giữa hai cũng có thể tạo sự khác biệt (xem this related answer item (2)).
Nói một truy vấn cố gắng sử dụng một phím tắt để viết so sánh null:
select * from SomeTable
where IsNull(SomeNullableBitField, -1) != IsNull(SomeOtherNullableBitField, -1);
đó là khác biệt so với
select * from SomeTable
where coalesce(SomeNullableBitField, -1) != coalesce(SomeOtherNullableBitField, -1);
Bởi vì trong trường hợp đầu tiên, IsNull() buộc kiểu được một chút (do đó -1 được chuyển thành true) trong khi trường hợp thứ hai sẽ thúc đẩy cả hai thành một 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;
Có một nhận xét/liên kết tương tự (@Martin Smith) về chính câu hỏi đó.
[COALESCE documentation] (http://msdn.microsoft.com/en-us/library/ms190349.aspx) có ghi chú này: ISNULL và COALESCE mặc dù tương đương, có thể hoạt động khác nhau. Một biểu thức liên quan đến ISNULL với các tham số không null được coi là NOT NULL, trong khi các biểu thức liên quan đến COALESCE với các tham số không null được coi là NULL ... –
'ISNULL' cũng sẽ ép buộc kết quả cho kiểu dữ liệu của biểu thức đầu tiên [ như minh họa ở đây] (http://haacked.com/archive/2005/01/21/difference-between-isnull-and-coalesce.aspx) –
Bài viết này nêu ra sự khác biệt khá tốt ... http: // sqlmag .com/t-sql/coalesce-vs-isnull –