Khi truy vấn cơ sở dữ liệu SQL Server, đôi khi bạn không muốn trả về giá trị null trong tập kết quả của mình. Và có thể có những lúc bạn muốn chúng trả lại. Nhưng cũng có thể có những lúc bạn muốn chúng được trả lại nhưng dưới dạng một giá trị khác.
Đó là những gì ISNULL()
chức năng dành cho.
ISNULL()
là một hàm T-SQL cho phép bạn thay thế NULL
với một giá trị cụ thể mà bạn chọn.
Ví dụ
Đây là một truy vấn cơ bản trả về một tập hợp kết quả nhỏ:
SELECT TaskCode AS Result FROM Tasks;
Kết quả:
Result ------ cat123 null null pnt456 rof789 null
Chúng ta có thể thấy rằng có ba hàng chứa giá trị rỗng.
Nếu chúng tôi không muốn các giá trị null xuất hiện như vậy, chúng tôi có thể sử dụng ISNULL()
để thay thế null
với một giá trị khác.
Như thế này:
SELECT ISNULL(TaskCode, 'N/A') AS Result FROM Tasks;
Kết quả:
Result ------ cat123 N/A N/A pnt456 rof789 N/A
Chúng tôi cũng có thể thay thế nó bằng chuỗi trống:
SELECT ISNULL(TaskCode, '') AS Result FROM Tasks;
Kết quả:
Result ------ cat123 pnt456 rof789
Lưu ý rằng ISNULL()
yêu cầu đối số thứ hai thuộc loại có thể được chuyển đổi ngầm định thành kiểu dữ liệu của đối số đầu tiên. Đó là vì nó trả về kết quả bằng cách sử dụng kiểu dữ liệu của đối số đầu tiên.
Ngăn chặn các hàng rỗng biến mất
Có một số hàm T-SQL trong đó các giá trị null bị loại bỏ khỏi tập kết quả. Trong những trường hợp như vậy, các giá trị rỗng sẽ hoàn toàn không được trả lại.
Mặc dù đây có thể là một kết quả mong muốn trong một số trường hợp, nhưng trong những trường hợp khác, nó có thể là thảm họa, tùy thuộc vào những gì bạn cần làm với dữ liệu sau khi dữ liệu được trả về.
Một ví dụ về hàm như vậy là STRING_AGG()
. Chức năng này cho phép bạn trả về tập kết quả dưới dạng danh sách được phân tách. Tuy nhiên, nó cũng loại bỏ các giá trị null khỏi tập kết quả. Vì vậy, nếu chúng tôi sử dụng hàm này với dữ liệu mẫu ở trên, chúng tôi sẽ nhận được ba kết quả thay vì sáu:
SELECT STRING_AGG(TaskCode, ', ') AS Result FROM Tasks;
Kết quả:
Result ---------------------- cat123, pnt456, rof789
Vì vậy, ba hàng chứa giá trị rỗng sẽ không được trả về.
Trong nhiều trường hợp, đây là một kết quả hoàn hảo, vì tập kết quả của chúng tôi không lộn xộn với các giá trị rỗng. Tuy nhiên, điều này cũng có thể gây ra sự cố, tùy thuộc vào dữ liệu sẽ được sử dụng để làm gì.
Do đó, nếu chúng ta muốn giữ lại các hàng có giá trị null, chúng ta có thể sử dụng ISNULL()
để thay thế các giá trị null bằng một giá trị khác:
SELECT STRING_AGG(ISNULL(TaskCode, 'N/A'), ', ') AS Result FROM Tasks;
Kết quả:
Result ------------------------------------- cat123, N/A, N/A, pnt456, rof789, N/A
Hàm COALESCE ()
ISNULL()
hàm hoạt động theo cách tương tự với COALESCE()
hàm số. Vì vậy, chúng tôi có thể thay thế mã trên bằng mã này:
SELECT STRING_AGG(COALESCE(TaskCode, 'N/A'), ', ') AS Result FROM Tasks;
Và nhận được kết quả tương tự:
Result ------------------------------------- cat123, N/A, N/A, pnt456, rof789, N/A
Tuy nhiên, có một số khác biệt trong cách hai chức năng hoạt động. Để biết thêm thông tin về sự khác biệt, dưới đây là so sánh của COALESCE()
và ISNULL()
trên trang web của Microsoft.