ISNULL - chỉ khả dụng trong SQL Server. Cho phép thử nghiệm và thay thế giá trị NULL bằng một giá trị khác.
COALESCE - Tiêu chuẩn ANSI. Cho phép thử nghiệm và thay thế giá trị NULL bằng giá trị khác không đầu tiên trong tập đối số có độ dài thay đổi. Điều quan trọng cần lưu ý là các yếu tố ưu tiên loại dữ liệu vào đây
-- Conversion failed when converting the varchar value 'a' to data type int
SELECT COALESCE(CAST(NULL AS varchar(10)), 'a', 1)
-- Returns 1
SELECT COALESCE(CAST(NULL AS varchar(10)), 1, 'a')
Trong ví dụ trên, 'a' là giá trị khác không đầu tiên nhưng dữ liệu ký tự có độ ưu tiên thấp hơn số nguyên.
Một cân nhắc khác giữa ISNULL vs COALESCE là kết quả của ISNULL được xác định là KHÔNG NULL trong khi kết quả của một cuộc gọi COALESCE là NULLable. Xem bài đăng của JRJ ISNULL () <> COALESCE () Mặc dù điều đó có vẻ là một việc nhỏ, trình tối ưu hóa truy vấn có thể thực hiện các kế hoạch khác nhau dựa trên tính vô hiệu của một cột.
Bạn có thể dễ dàng kiểm tra tính vô hiệu của các biểu thức isnull / coalesce / case của mình bằng cách chạy nó thông qua dmo sys.dm_exec_describe_first_result_set
-- these all evaluate to not nullable (is_nullable = 0) because I'm not clever enough
DECLARE @sql nvarchar(4000) = N'
SELECT ISNULL(NULL, 1) AS I
, COALESCE(NULL, 1) AS C
, CASE WHEN NULL = NULL THEN NULL ELSE 1 END AS C1
'
SELECT
DMO.*
FROM
sys.dm_exec_describe_first_result_set(@sql, NULL, 0) AS DMO
CASE - Cũng là một hàm vô hướng chuẩn ANSI. Tôi đã xem xét việc sử dụng CASE so với hai lần trước khi tôi có một bài kiểm tra không thể diễn đạt bằng một số vô hướng đơn giản nhưng đó là một câu trả lời khá yếu, tôi thừa nhận.
COALESCEđược mở rộng raCASEnhưng rõ ràng trong mộtCASEtuyên bố bạn tự viết, bạn có thể linh hoạt hơn trong cácWHENđiều kiện. ChoISNULLvsCOALESCEliên quan / trùng lặp?