Điều này là do cách NOT IN
làm. Nếu bất kỳ giá trị nào trong danh sách là NULL thì nó sẽ không trả về kết quả. ví dụ:
SELECT [TestColumn] = 3
WHERE 3 NOT IN (1, 2, NULL)
Sẽ không trả về kết quả nào và không phải là 3.
Nếu bạn mở rộng ví dụ thành câu lệnh OR tương đương, bạn sẽ thấy lý do tại sao:
WHERE 3 != 1
AND 3 != 2
AND 3 != NULL
Kể từ 3 != NULL
Đánh giá thành false vì không có gì bằng NULL, câu lệnh trả về false.
Bạn có thể đạt được kết quả cần thiết theo 3 cách.
1) Sử dụng ELSE
trong trường hợp của bạn tuyên bố để đảm bảo không có NULL
kết quả
SELECT OrderNumber, Client, Product
FROM Orders
WHERE Product not in(CASE WHEN client = 'client_a' and product = 'product_1' THEN Product ELSE '' END)
2) Thay đổi IN
không bằng nhau, vì dù sao câu lệnh trường hợp của bạn cũng sẽ chỉ trả về 1 giá trị
SELECT OrderNumber, Client, Product
FROM Orders
WHERE Product != (CASE WHEN client = 'client_a' and product = 'product_1' THEN Product END)
3) Sửa đổi logic của bạn, điều này có thể được viết lại thành
SELECT OrderNumber, Client, Product
FROM Orders
WHERE NOT (Product = 'product_1' AND Client = 'Client_a')