Trong SQL Server, NULLIF()
biểu thức kiểm tra giá trị của hai biểu thức được chỉ định. Nó trả về giá trị null nếu chúng bằng nhau, nếu không nó trả về biểu thức đầu tiên.
Cú pháp
Cú pháp như sau:
NULLIF ( expression , expression )
Ví dụ
Dưới đây là một ví dụ để chứng minh:
SELECT NULLIF(3, 3);
Kết quả:
NULL
Ở đây, cả hai biểu thức đều bằng nhau và do đó kết quả là giá trị rỗng.
Đây là những gì sẽ xảy ra khi các biểu thức không bằng nhau:
SELECT NULLIF(3, 7);
Kết quả:
3
Lần này giá trị đầu tiên được trả về.
Dưới đây là một ví dụ bao gồm cả hai kết quả:
SELECT
NULLIF(0, 0) AS a,
NULLIF(3, 3) AS b,
NULLIF(3, 0) AS c,
NULLIF(0, 3) AS d;
Kết quả:
+------+------+-----+-----+ | a | b | c | d | |------+------+-----+-----| | NULL | NULL | 3 | 0 | +------+------+-----+-----+
Một ví dụ thực tế
Giả sử chúng ta có một bảng với dữ liệu sau:
SELECT
ProductName,
ProductPrice
FROM Products;
Kết quả:
+-------------------------------------+----------------+ | ProductName | ProductPrice | |-------------------------------------+----------------| | Left handed screwdriver | 25.99 | | Long Weight (blue) | 14.75 | | Long Weight (green) | 11.99 | | Smash 2000 Sledgehammer | 0.00 | | Chainsaw (includes 3 spare fingers) | 0.00 | | Straw Dog Box | NULL | | Bottomless Coffee Mugs (4 Pack) | 9.99 | | Right handed screwdriver | 25.99 | +-------------------------------------+----------------+ (8 rows affected)
Và giả sử chúng ta muốn tìm xem có bao nhiêu sản phẩm có giá dương. Nói cách khác, chúng tôi không muốn bao gồm các sản phẩm có giá hoặc bằng không hoặc giá trị rỗng.
Để thực hiện việc này, chúng ta có thể sử dụng NULLIF()
kết hợp với COUNT()
chức năng:
SELECT
COUNT(NULLIF(ProductPrice, 0.00)) AS Result
FROM Products;
Kết quả:
+----------+ | Result | |----------| | 5 | +----------+ Warning: Null value is eliminated by an aggregate or other SET operation.
Chúng tôi nhận được 5 như mong đợi, chính xác là số hàng có giá trị dương trong ProductPrice
cột.
Điều này hoạt động vì COUNT()
hàm chỉ đếm các giá trị không rỗng. Bằng cách chuyển đổi các số tiền bằng 0 thành rỗng, chúng tôi có thể bỏ qua các giá trị đó trong tính toán của mình.
Đây lại là nó mà không có NULLIF()
chức năng.
SELECT COUNT(ProductPrice) AS Result
FROM Products;
Kết quả:
+----------+ | Result | |----------| | 7 | +----------+ Warning: Null value is eliminated by an aggregate or other SET operation.
Lần này nó bao gồm các số tiền bằng 0 và chúng ta nhận được 7. Nó vẫn bỏ qua hàng 6 vì hàng đó thực sự có giá trị null.
Khi đối số đầu tiên là hằng số rỗng
Hàm không chấp nhận hằng số null làm đối số đầu tiên của nó:
SELECT NULLIF(null, 3);
Kết quả:
Msg 4151, Level 16, State 1, Line 1 The type of the first argument to NULLIF cannot be the NULL constant because the type of the first argument has to be known.
Khi thông báo lỗi nêu rõ, loại của đối số đầu tiên phải được biết. Giá trị trả về của hàm sử dụng kiểu dữ liệu của biểu thức đầu tiên và lỗi này phản ánh điều đó.
Lỗi này nên khá hiếm. Trong hầu hết các trường hợp, bạn sẽ chuyển tên cột làm đối số đầu tiên và trong SQL Server, các cột có kiểu dữ liệu xác định. Trong những trường hợp như vậy, giá trị null sẽ thực sự được chấp nhận do SQL Server biết kiểu dữ liệu của cột.
Điều tương tự cũng có thể được nói đối với các biến. Nếu bạn chuyển một biến, bạn sẽ phải khai báo kiểu của nó và do đó, bạn sẽ không gặp lỗi.
Số lượng đối số không hợp lệ
Việc gọi hàm mà không chuyển bất kỳ đối số nào dẫn đến lỗi:
SELECT NULLIF();
Kết quả:
Msg 102, Level 15, State 1, Line 1 Incorrect syntax near ')'.
Và việc chuyển quá nhiều đối số cũng gây ra lỗi:
SELECT NULLIF(1, 2, 3);
Kết quả:
Msg 102, Level 15, State 1, Line 1 Incorrect syntax near ','.