Do sau:Tại sao T-SQL ISNULL() cắt ngắn chuỗi và COALESCE thì không?
SELECT ISNULL('XY' + NULL, 'ABCDEFGHIJ') -- Outputs ABC (Why?)
SELECT COALESCE('XY' + NULL, 'ABCDEFGHIJ') -- Outputs ABCDEFGHIJ
Tại sao các báo cáo trở lại kết quả khác nhau?
Do sau:Tại sao T-SQL ISNULL() cắt ngắn chuỗi và COALESCE thì không?
SELECT ISNULL('XY' + NULL, 'ABCDEFGHIJ') -- Outputs ABC (Why?)
SELECT COALESCE('XY' + NULL, 'ABCDEFGHIJ') -- Outputs ABCDEFGHIJ
Tại sao các báo cáo trở lại kết quả khác nhau?
Theo Microsoft documentation, cho chức năng:
ISNULL(check_expression, replacement_value)
replacement_value
phải có một loại đó là mặc nhiên chuyển đổi thành các loại check_expression
. Lưu ý rằng loại cho 'xy'+NULL
là VARCHAR(3)
. Bởi vì chuỗi này 'ABCDEFGHIJ'
của bạn được đúc thành VARCHAR(3)
và do đó được cắt.
Có vẻ lạ tại sao nó không phải là VARCHAR(2)
, nhưng đây là cách nó - một ký tự dài hơn 'xy'
. Bạn có thể chơi với điều này SQLFiddle và xem cho chính mình rằng loại cho 'xy'+NULL
là giống như đối với biểu thức CASE WHEN 1=2 THEN 'XYZ' ELSE NULL END
, là NULL
nhưng hoàn toàn tương thích với VARCHAR(3)
.
Dường như đối với biểu thức 'xy'+NULL
độ dài nhận biết có thể được tính là 'xy'
chiều dài chuỗi (2) cộng 1 cho mỗi NULL
được thêm vào. Ví dụ: loại 'xy'+NULL+NULL
là VARCHAR(4)
, nhập cho 'xy'+NULL+NULL+NULL
là VARCHAR(5)
v.v. - hãy xem SQLFiddle này. Điều này là cực kỳ kỳ lạ, nhưng đó là cách MS SQL Server 2008 và 2012 hoạt động.
ISNULL()
chuyển giá trị thay thế thành loại biểu thức kiểm tra. Trong trường hợp này, loại biểu thức kiểm tra là CHAR(2)
, do đó, chuyển đổi giá trị thay thế sẽ cắt bớt nó (bạn có chắc là bạn đang nhận được ABC
và không chỉ AB
?).
Từ Microsoft documentation:
replacement_value
có thể được rút ngắn nếureplacement_value
dài hơncheck_expression
.
"ABC" cho chắc chắn. – natenho
Bạn có thể kiểm tra tất cả các khác biệt ở đây, rất rõ ràng của nó
MSDN: http://msdn.microsoft.com/en-us/library/ms190349.aspx
MSDN Blog: http://blogs.msdn.com/b/sqltips/archive/2008/06/26/differences-between-isnull-and-coalesce.aspx
+1 cho bài đăng trên blog, tôi không nhận thấy nó trong nghiên cứu đầu tiên của mình. Rất tốt tài nguyên. – natenho
Giải thích tốt, mặc dù tôi không thuyết phục về varchar (3) thay vì varchar (2) - Tôi không thể tìm thấy nó tài liệu bất cứ nơi nào. – natenho
Chứng minh rằng đó là VARCHAR (3): http://sqlfiddle.com/#!3/d41d8/20987 – mvp
Tôi phải tăng thông tin ở đây để giải thích thêm về hành vi COALESCE trong hành vi ISNULL, từ Microsoft [tài liệu] (http://technet.microsoft.com/en-us/library/ms190349.aspx): Biểu thức COALESCE là một cú pháp cú pháp cho biểu thức CASE. Tức là, mã COALESCE (expression1, ... n) được viết lại bởi trình tối ưu hóa truy vấn như biểu thức CASE sau đây: CASE WHEN (expression1 IS NOT NULL) THEN expression1 WHEN (expression2 IS NOT NULL) THEN expression2 ... Biểu thức ELSEN END -> Loại trả về trường hợp được cho bởi độ ưu tiên cao nhất expr. – natenho