Như Mark đã chỉ ra, bạn sẽ khó có thể tìm thấy sự khác biệt về hiệu suất; Tôi nghĩ các yếu tố khác sẽ quan trọng hơn. Đối với tôi, tôi luôn sử dụng COALESCE và hầu hết những điều này đã được bạn hoặc Mark đề cập:
- COALESCE là tiêu chuẩn ANSI. Đó là một điều ít hơn tôi phải lo lắng nếu tôi sẽ chuyển mã của mình. Đối với cá nhân tôi, điều này không quan trọng lắm, vì tôi biết những cổng như vậy thực sự xảy ra bên ngoài thế giới lớp học của Celko như thế nào, nhưng với một số người thì đây là một lợi ích.
- Trái với những gì bạn nói về khả năng đọc, tôi thấy việc đọc ISNULL khó hơn, đặc biệt là đối với người dùng đến từ các ngôn ngữ hoặc nền tảng khác nơi ISNULL trả về boolean (không tồn tại trong SQL Server). Cấp, COALESCE khó đánh vần hơn, nhưng ít nhất nó không dẫn đến các giả định không chính xác.
- COALESCE linh hoạt hơn rất nhiều, vì tôi có thể nói COALESCE (a, b, c, d) trong khi với ISNULL tôi phải làm rất nhiều việc lồng nhau để đạt được điều tương tự.
Bạn cũng nên chắc chắn rằng bạn biết về cách ưu tiên loại dữ liệu được xử lý bằng hai hàm nếu bạn đang sử dụng nó với các loại / quy tắc dữ liệu khác nhau, v.v.
Ghi chú
Có một ngoại lệ. Chúng được xử lý khác nhau trong các phiên bản hiện tại của SQL Server:
SELECT COALESCE((SELECT some_aggregate_query),0);
SELECT ISNULL((SELECT some_aggregate_query),0);
Các COALESCE
biến thể sẽ thực sự thực hiện some_aggregate_query
hai lần (một lần để kiểm tra giá trị, và một lần để trả lại khi khác không), trong khi ISNULL
sẽ chỉ thực hiện subquery một lần. Tôi nói về một vài sự khác biệt khác ở đây:
COALESCE
được đánh giá hai lần.