trường hợp so với isnull so với hợp nhất


9

Tôi chỉ đọc qua tài liệu cho các bài kiểm tra SQL Server 2012 và tôi đã thấy điểm sau:

trường hợp so với isnull so với hợp nhất

Bây giờ, tôi biết CÁCH sử dụng từng cái nhưng tôi không biết KHI sử dụng từng cái. Xin một số người có thể làm rõ. Cảm ơn.

Thi thiên Xin vui lòng chúng tôi có thể có một thẻ cho các câu hỏi thi?


2
COALESCEđược mở rộng ra CASEnhưng rõ ràng trong một CASEtuyên bố bạn tự viết, bạn có thể linh hoạt hơn trong các WHENđiều kiện. Cho ISNULLvs COALESCE liên quan / trùng lặp?
Martin Smith

liên quan tôi đồng ý. nhưng không bị lừa Cảm ơn vì nhận xét :)
Stuart Blackler

Câu trả lời:


10

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.


Cảm ơn câu trả lời đầy đủ rất nhanh. Tôi không biết rằng thứ tự ưu tiên quan trọng COALESCE. Cảm ơn một lần nữa
Stuart Blackler

1
CASEvề mặt kỹ thuật là một biểu thức, không phải là một chức năng.
ypercubeᵀᴹ

1

ISNULL cung cấp cho bạn khả năng trả lại 1 lần lặp lại, COALESCE không giới hạn ở một Giá trị, ví dụ: COALESCE(v1,v2,v3,v4,v5) nếu V5 là Giá trị duy nhất KHÔNG PHẢI thì nó sẽ được trả về

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.