Trong SQL Server, COALESCE() biểu thức trả về đối số không rỗng đầu tiên của nó.
Cách hoạt động của nó là, chúng tôi chuyển một danh sách các đối số vào biểu thức, nó đánh giá các đối số theo thứ tự và trả về giá trị hiện tại của biểu thức đầu tiên mà ban đầu không đánh giá thành NULL .
Cú pháp
Cú pháp như sau:
COALESCE ( expression [ ,...n ] ) Ví dụ
Dưới đây là một ví dụ đơn giản để chứng minh:
SELECT COALESCE(null, 'Cat', 'Dog'); Kết quả:
Cat
Trong trường hợp này, Cat là đối số không phải NULL đầu tiên và vì vậy COALESCE() đã trả lại giá trị đó.
Biểu thức
Như đã đề cập, COALESCE() trả về giá trị hiện tại của biểu thức đầu tiên mà ban đầu không đánh giá thành NULL . Do đó, nếu chúng ta truyền một biểu thức như sau:
SELECT COALESCE( null, 2 * 3 ); Chúng tôi nhận được điều này:
6
Hàm trả về kiểu dữ liệu của biểu thức có mức độ ưu tiên kiểu dữ liệu cao nhất. Nếu tất cả các biểu thức là không thể giá trị, kết quả được nhập là không thể xác nhận.
Khi Tất cả Đối số là KHÔNG ĐỦ
Nếu tất cả các đối số là NULL , COALESCE() trả về NULL . Tuy nhiên, ít nhất một trong các giá trị null phải là NULL được nhập , nếu không sẽ xảy ra lỗi.
Nói cách khác, tất cả chúng không thể là NULL hằng số:
SELECT COALESCE( null, null ); Chúng tôi nhận được điều này:
Msg 4127, Level 16, State 1, Line 1 At least one of the arguments to COALESCE must be an expression that is not the NULL constant.
Trong trường hợp này, tất cả các đối số là NULL hằng số, và do đó, một lỗi đã được trả về.
Dưới đây là một ví dụ cơ sở dữ liệu để minh họa một tình huống trong đó COALESCE() trả về NULL khi tất cả các đối số là NULL .
Giả sử chúng ta chạy truy vấn sau:
SELECT CustomerId, CustomerCategoryId
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1; Kết quả:
CustomerId CustomerCategoryId ----------- ------------------ NULL NULL
Cả hai cột đều chứa NULL giá trị.
Vì vậy, nếu chúng ta chuyển cả hai cột vào COALESCE() , chúng tôi nhận được kết quả là NULL :
SELECT COALESCE( CustomerId, CustomerCategoryId )
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1; Kết quả:
NULL
Điều này cũng đúng nếu chúng ta thay thế một trong các cột bằng NULL hằng số:
SELECT COALESCE( CustomerId, null )
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1; Kết quả:
NULL
Vì vậy, chỉ khi tất cả đối số là NULL liên tục mà chúng tôi gặp lỗi.
Thay thế NULL Kết quả với Giá trị đã biết
Chúng ta có thể bao gồm một giá trị đã biết làm đối số cuối cùng để thay thế bất kỳ kết quả NULL nào bằng giá trị đã biết đó.
Ví dụ:truy vấn sau trả về NULL :
SELECT SUM( UnitPrice )
FROM Sales.SpecialDeals; Kết quả:
NULL
Trong trường hợp này, UnitPrice cột chứa giá trị NULL trong tất cả các hàng và do đó kết quả là NULL .
Chúng ta có thể sử dụng COALESCE() như thế này:
SELECT COALESCE( SUM( UnitPrice ), 0 )
FROM Sales.SpecialDeals; Kết quả:
0.00
Bây giờ, kết quả NULL được thay thế bằng một giá trị đã biết (không).
COALESCE() so với CASE
COALESCE() biểu thức thực sự là một phím tắt cú pháp cho CASE biểu hiện. Khi chúng tôi sử dụng COALESCE() biểu thức, trình tối ưu hóa truy vấn sẽ viết lại nó dưới dạng CASE biểu thức.
Khi tôi chạy câu lệnh sau:
SELECT COALESCE( CustomerId, CustomerCategoryId )
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1; Trình tối ưu hóa truy vấn sẽ viết lại nó thành như sau:
CASE
WHEN [WideWorldImporters].[Sales].[SpecialDeals].[CustomerID] IS NOT NULL THEN [WideWorldImporters].[Sales].[SpecialDeals].[CustomerID]
ELSE [WideWorldImporters].[Sales].[SpecialDeals].[CustomerCategoryID]
END COALESCE() so với ISNULL()
Theo một số cách, COALESCE() biểu thức tương tự như ISNULL() hàm số. Nhưng có sự khác biệt. Cụ thể:
-
ISNULL()là một hàm và chỉ được đánh giá một lần.COALESCE()mặt khác, là một biểu thức và có thể được đánh giá nhiều lần. - Việc xác định kiểu dữ liệu của biểu thức kết quả là khác nhau.
ISNULLsử dụng kiểu dữ liệu của tham số đầu tiên,COALESCEtuân theoCASEquy tắc biểu thức và trả về kiểu dữ liệu của giá trị có mức độ ưu tiên cao nhất. - Tính NULL của biểu thức kết quả khác với
ISNULLvàCOALESCE.ISNULLgiá trị trả về luôn được coi là KHÔNG CÓ THỂ NULL (giả sử giá trị trả về là giá trị không thể rỗng). Ngược lại,COALESCEvới các tham số không rỗng được coi làNULL. - Xác thực cho
ISNULLvàCOALESCEcũng khác nhau. Ví dụ:NULLgiá trị choISNULLđược chuyển đổi thànhintmặc dù choCOALESCE, bạn phải cung cấp một loại dữ liệu. -
ISNULLchỉ có hai tham số. Ngược lạiCOALESCEnhận một số lượng tham số thay đổi.
Thông tin thêm
Xem tài liệu của Microsoft để biết thêm chi tiết và các ví dụ phức tạp hơn.