Giá trị NULL có nghĩa là không có giá trị hoặc không xác định. Giá trị NULL có thể được sử dụng cho các giá trị chưa được cung cấp, chẳng hạn như khi khách hàng chưa cung cấp địa chỉ email. Như bạn đã thấy trước đây, một giá trị NULL cũng có thể được trả về bởi một số hàm chuyển đổi nếu một giá trị không tương thích với kiểu dữ liệu đích.
NULL thực sự là một non-value, không ai biết nó là gì, bằng gì, nó không lớn hơn hay nhỏ hơn bất kỳ giá trị nào khác, nhưng đôi khi chúng ta lại cần làm việc với chúng, Rất may, T-SQL cung cấp các hàm để chuyển đổi hoặc thay thế các giá trị NULL.
Các nội dung chính
ISNULL
Hàm ISNULL nhận hai đối số. Đầu tiên là một biểu thức mà chúng ta đang test. Nếu giá trị của đối số đầu tiên đó là NULL, thì hàm trả về đối số thứ hai. Nếu biểu thức đầu tiên không rỗng, nó được trả về không thay đổi.
Ví dụ: giả sử bảng Sales.Customer trong cơ sở dữ liệu bao gồm cột MiddleName cho phép giá trị NULL. Khi truy vấn bảng này, thay vì trả về NULL trong kết quả, bạn có thể chọn trả về một giá trị cụ thể, chẳng hạn như “Không có” (None).
SELECT FirstName,
ISNULL(MiddleName, 'None') AS MiddleIfAny,
LastName
FROM Sales.Customer;
Kết quả từ truy vấn này có thể trông giống như sau:
FirstName | MiddleIfAny | LastName |
Orlando | N. | Gee |
Keith | None | Howard |
Donna | F. | Gonzales |
… | … | … |
Lưu ý: Giá trị được thay thế cho NULL phải cùng kiểu dữ liệu với biểu thức đang được đánh giá. Trong ví dụ trên, MiddleName là một varchar, vì vậy giá trị thay thế không thể là số. Ngoài ra, bạn sẽ cần chọn một giá trị sẽ không xuất hiện trong dữ liệu dưới dạng giá trị thông thường. Đôi khi sẽ khó khăn để tìm một giá trị sẽ không bao giờ xuất hiện trong dữ liệu của bạn.
Ví dụ trước đã xử lý giá trị NULL trong bảng nguồn, nhưng bạn có thể sử dụng ISNULL với bất kỳ biểu thức nào có thể trả về NULL, bao gồm lồng một hàm TRY_CONVERT trong một hàm ISNULL.
COALESCE
Hàm ISNULL không phải là tiêu chuẩn ANSI, vì vậy bạn có thể muốn sử dụng hàm COALESCE để thay thế. COALESCE linh hoạt hơn một chút là nó có thể nhận một số lượng biến đối số, mỗi đối số là một biểu thức. Nó sẽ trả về biểu thức đầu tiên trong danh sách không phải là NULL.
Nếu chỉ có hai đối số, COALESCE hoạt động giống như ISNULL. Tuy nhiên, với nhiều hơn hai đối số, COALESCE có thể được sử dụng thay thế cho biểu thức CASE nhiều phần bằng cách sử dụng ISNULL.
Nếu tất cả các đối số là NULL, hàm COALESCE trả về giá trị NULL. Tất cả các biểu thức phải trả về kiểu dữ liệu giống nhau hoặc tương thích.
Cú pháp như sau:
SELECT COALESCE(<expression_1>[, ...<expression_n>];
Ví dụ sau sử dụng một bảng hư cấu có tên HR.Wages, bao gồm ba cột chứa thông tin về thu nhập hàng tuần của nhân viên: mức lương theo giờ, mức lương hàng tuần và hoa hồng trên mỗi đơn vị bán được. Tuy nhiên, một nhân viên chỉ nhận được một loại lương. Đối với mỗi nhân viên, một trong ba cột đó sẽ có giá trị, hai cột còn lại sẽ là NULL. Để xác định tổng số tiền được trả cho mỗi nhân viên, bạn có thể sử dụng COALESCE để chỉ trả về giá trị không rỗng được tìm thấy trong ba cột đó.
SELECT EmployeeID,
COALESCE(HourlyRate * 40,
WeeklySalary,
Commission * SalesQty) AS WeeklyEarnings
FROM HR.Wages;
Kết quả có thể trông giống như sau:
EmployeeID | WeeklyEarnings |
1 | 899.76 |
2 | 1001.00 |
3 | 1298.77 |
… | … |
NULLIF
Hàm NULLIF cho phép bạn trả về NULL trong các điều kiện nhất định. Chức năng này có các ứng dụng hữu ích trong các lĩnh vực như làm sạch dữ liệu, khi bạn muốn thay thế các ký tự trống hoặc ký tự giữ chỗ bằng NULL.
NULLIF nhận hai đối số và trả về NULL nếu chúng tương đương nhau. Nếu chúng không bằng nhau, NULLIF trả về đối số đầu tiên.
Trong ví dụ này, NULLIF thay thế chiết khấu 0 bằng NULL. Nó trả về giá trị chiết khấu nếu nó không phải là 0:
SELECT SalesOrderID,
ProductID,
UnitPrice,
NULLIF(UnitPriceDiscount, 0) AS Discount
FROM Sales.SalesOrderDetail;
Kết quả có thể trông giống như sau:
SalesOrderID | ProductID | UnitPrice | Discount |
71774 | 836 | 356.898 | NULL |
71780 | 988 | 112.998 | 0.4 |
71781 | 748 | 818.7 | NULL |
71781 | 985 | 112.998 | 0.4 |
… | … | … | … |
Mình cũng có một bài viết khác về làm việc với giá trị NULL: TỪ CHUYỆN “ĂN GÌ CŨNG ĐƯỢC” CỦA CHỊ EM PHỤ NỮ LẠI NGHĨ VỀ NULL TRONG SQL, các bạn có thể xem thêm để hiểu kỹ hơn nhé!
Tìm hiểu các bài chia sẻ khác của mình về SQL tại đây.