Hàm COALESCE trong TSQL


109

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:


74

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/


6
Hãy cẩn thận với việc sử dụng 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ư COALESCEvậy.
xích

215

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.


4
+1 Để được giải thích của bạn về mức độ ưu tiên của các loại dữ liệu. Tôi tin rằng ISNULLlợ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ù
Lamak

5
Mã ví dụ cuối cùng của bạn nên cung cấp cho các lỗi 'Ít nhất một trong các đối số liên hiệp phải là NULL gõ' Nguồn: sql-server-performance.com/2007/...
maqk

2
Tài liệu nói rất nhiều trong khi cũng quản lý để cung cấp giá trị gần như bằng không. Tài liệu tốt cung cấp một ví dụ đơn giản với một kết quả đơn giản. Coalesce ngay lập tức chuyển sang 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.
P.Brian.Mackey


18

Đâ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

4

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/


3
Bài viết mà bạn liên kết đến là cực kỳ sai lầm (như được chỉ ra bởi một số người, bao gồm cả tác giả, trong phần nhận xét). Tất cả các thủ thuật gọn gàng mà anh ấy nêu bật TẤT CẢ đều có thể được thực hiện bằng cách sử dụng ISNULL thay cho sự kết hợp.
Hobo Spider,

3

Đâ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

  • có ít nhất hai đối số.
  • đối số phải có kiểu số nguyên.
  • trả về đối số không rỗng đầu tiên.

ví dụ

  • kết hợp (null, 1, 2, 3) sẽ trả về 1.
  • Coalesce (null, null) sẽ trả về null.

1

Đị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


0
declare @store table (store_id varchar(300))
insert into @store 
values ('aa'),('bb'),('cc')
declare @str varchar (4000)
select @str = concat(@str+',',store_id) from @store
select @str

1
Tôi thấy cái này đơn giản hơn nhiều.
Xiao
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.