Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

SQL Server COALESCE () Giải thích

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 theo CASE 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 ISNULLCOALESCE . 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 ISNULLCOALESCE cũng khác nhau. Ví dụ:NULL giá trị cho ISNULL được chuyển đổi thành int mặc dù cho COALESCE , bạn phải cung cấp một loại dữ liệu.
  • ISNULL chỉ có hai tham số. Ngược lại COALESCE 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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cập nhật thống kê SQL Server bằng cách sử dụng kế hoạch bảo trì cơ sở dữ liệu

  2. Kiểm tra có bao nhiêu mục thư trong hàng đợi trong thư cơ sở dữ liệu trong SQL Server (T-SQL)

  3. Cách DENSE_RANK () hoạt động trong SQL Server

  4. Cách thay đổi tên cơ sở dữ liệu trong SQL Server bằng T-SQL

  5. Học thiết kế cơ sở dữ liệu với SQL Server Management Studio (SSMS) - Phần 2