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.
ISNULL
sử dụng kiểu dữ liệu của tham số đầu tiên,COALESCE
tuân theoCASE
quy 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
ISNULL
vàCOALESCE
.ISNULL
giá 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,COALESCE
với các tham số không rỗng được coi làNULL
. - Xác thực cho
ISNULL
vàCOALESCE
cũng khác nhau. Ví dụ:NULL
giá trị choISNULL
được chuyển đổi thànhint
mặc dù choCOALESCE
, bạn phải cung cấp một loại dữ liệu. -
ISNULL
chỉ có hai tham số. Ngược lạiCOALESCE
nhậ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.