Ai đó có thể giải thích cách hoạt động của hàm COALESCE trong TSQL không? Cú pháp như sau
COALESCE (x, y)
Tài liệu MSDN về chức năng này khá mơ hồ
Ai đó có thể giải thích cách hoạt động của hàm COALESCE trong TSQL không? Cú pháp như sau
COALESCE (x, y)
Tài liệu MSDN về chức năng này khá mơ hồ
Câu trả lời:
Tôi đã được nói rằng COALESCE ít tốn kém hơn ISNULL, nhưng nghiên cứu không chỉ ra điều đó. ISNULL chỉ nhận hai tham số, trường được đánh giá là NULL và kết quả bạn muốn nếu nó được đánh giá là NULL. COALESCE sẽ nhận bất kỳ số lượng tham số nào và trả về giá trị đầu tiên gặp phải không phải là NULL.
Có một mô tả kỹ lưỡng hơn về các chi tiết ở đây http://www.mssqltips.com/sqlservertip/2689/deciding-between-coalesce-and-isnull-in-sql-server/
Tôi không chắc tại sao bạn nghĩ rằng tài liệu này là mơ hồ.
Nó chỉ đơn giản là đi qua tất cả các tham số một và trả về giá trị đầu tiên NOT NULL
.
COALESCE(NULL, NULL, NULL, 1, 2, 3)
=> 1
COALESCE(1, 2, 3, 4, 5, NULL)
=> 1
COALESCE(NULL, NULL, NULL, 3, 2, NULL)
=> 3
COALESCE(6, 5, 4, 3, 2, NULL)
=> 6
COALESCE(NULL, NULL, NULL, NULL, NULL, NULL)
=> NULL
Nó chấp nhận khá nhiều tham số, nhưng chúng phải cùng kiểu dữ liệu. (Nếu chúng không cùng kiểu dữ liệu, chúng sẽ được truyền ngầm sang một kiểu dữ liệu thích hợp bằng cách sử dụng thứ tự ưu tiên kiểu dữ liệu .)
Nó giống như ISNULL()
nhưng đối với nhiều tham số, thay vì chỉ hai.
Nó cũng có ANSI-SQL
, nơi-như ISNULL()
không.
ISNULL
lợi nhuận một giá trị với các kiểu dữ liệu tương tự như các tham số đầu tiên, mặc dù
expressions
, so sánh với CASE, so sánh với ISNULL, và cuối cùng là một ví dụ không có kết quả. Sau đó, một ví dụ quá phức tạp với quá nhiều chi tiết. Khi tất cả những gì chúng ta cần là câu trả lời với 5 - 6 dòng WTF thì điều này đang và hiện.
Đây là cách tôi nhìn nhận về COALESCE ... và hy vọng nó có ý nghĩa ...
Ở dạng đơn giản….
Coalesce (FieldName, 'Empty')
Vì vậy, điều này dịch thành… Nếu "FieldName" là NULL, hãy điền giá trị trường bằng từ "EMPTY".
Bây giờ cho các giá trị khác nhau ...
Coalesce (FieldName1, FieldName2, Value2, Value3)
Nếu giá trị trong Fieldname1 là null, hãy điền nó bằng giá trị trong Fieldname2, nếu FieldName2 là NULL, hãy điền nó bằng Value2, v.v.
Đoạn mã thử nghiệm này cho cơ sở dữ liệu mẫu AdventureWorks2012 hoạt động hoàn hảo và đưa ra lời giải thích trực quan về cách hoạt động của COALESCE :
SELECT Name, Class, Color, ProductNumber,
COALESCE(Class, Color, ProductNumber) AS FirstNotNull
FROM Production.Product
Có rất nhiều thứ để kết hợp lại ngoài việc thay thế ISNULL. Tôi hoàn toàn đồng ý rằng "tài liệu" chính thức của liên kết là mơ hồ và vô ích. Bài viết này giúp ích rất nhiều. http://www.mssqltips.com/sqlservertip/1521/the-many-uses-of-coalesce-in-sql-server/
Đây là một truy vấn đơn giản chứa liên kết:
select * from person where coalesce(addressId, ContactId) is null.
Nó sẽ trả về những người mà cả addressId và contactId đều rỗng.
chức năng liên kết
ví dụ
Định nghĩa đơn giản nhất của hàm Coalesce () có thể là:
Hàm Coalesce () đánh giá tất cả các đối số được truyền vào, sau đó trả về giá trị của phiên bản đầu tiên của đối số không đánh giá thành NULL.
Lưu ý: nó đánh giá TẤT CẢ các tham số, tức là không bỏ qua đánh giá (các) đối số ở phía bên phải của tham số trả về / NOT NULL.
Cú pháp:
Coalesce(arg1, arg2, argN...)
Lưu ý : Ngoài các đối số đánh giá thành NULL, tất cả các đối số (NOT-NULL) khác phải có cùng kiểu dữ liệu hoặc phải có kiểu khớp (có thể được "hoàn toàn tự động chuyển đổi" thành kiểu dữ liệu tương thích), xem ví dụ phía dưới:
PRINT COALESCE(NULL, ('str-'+'1'), 'x') --returns 'str-1, works as all args (excluding NULLs) are of same VARCHAR type.
--PRINT COALESCE(NULL, 'text', '3', 3) --ERROR: passed args are NOT matching type / can't be implicitly converted.
PRINT COALESCE(NULL, 3, 7.0/2, 1.99) --returns 3.0, works fine as implicit conversion into FLOAT type takes place.
PRINT COALESCE(NULL, '1995-01-31', 'str') --returns '2018-11-16', works fine as implicit conversion into VARCHAR occurs.
DECLARE @dt DATE = getdate()
PRINT COALESCE(NULL, @dt, '1995-01-31') --returns today's date, works fine as implicit conversion into DATE type occurs.
--DATE comes before VARCHAR (works):
PRINT COALESCE(NULL, @dt, 'str') --returns '2018-11-16', works fine as implicit conversion of Date into VARCHAR occurs.
--VARCHAR comes before DATE (does NOT work):
PRINT COALESCE(NULL, 'str', @dt) --ERROR: passed args are NOT matching type, can't auto-cast 'str' into Date type.
HTH
ISNULL
, nó không chuẩn, kém linh hoạt, tôi đọc rằng nó sẽ trả về kiểu dữ liệu của đối số đầu tiên luôn chứ không phải kiểu dữ liệu của giá trị được trả về nhưCOALESCE
vậy.