Ini karena cara NOT IN
bekerja. Jika salah satu nilai dalam daftar adalah NULL maka tidak akan ada hasil. misalnya
SELECT [TestColumn] = 3
WHERE 3 NOT IN (1, 2, NULL)
Tidak akan mengembalikan hasil, dan bukan 3.
Jika Anda memperluas contoh ke dalam pernyataan OR yang setara, Anda akan melihat alasannya:
WHERE 3 != 1
AND 3 != 2
AND 3 != NULL
Sejak 3 != NULL
Mengevaluasi menjadi false karena tidak ada yang sama dengan NULL, pernyataan mengembalikan false.
Anda dapat mencapai hasil yang diperlukan dengan 3 cara.
1) Gunakan ELSE
dalam pernyataan kasus Anda untuk memastikan tidak ada NULL
hasil
SELECT OrderNumber, Client, Product
FROM Orders
WHERE Product not in(CASE WHEN client = 'client_a' and product = 'product_1' THEN Product ELSE '' END)
2) Ubah IN
tidak sama, karena pernyataan kasus Anda hanya akan mengembalikan 1 nilai
SELECT OrderNumber, Client, Product
FROM Orders
WHERE Product != (CASE WHEN client = 'client_a' and product = 'product_1' THEN Product END)
3) Perbaiki logika Anda, ini dapat ditulis ulang sebagai
SELECT OrderNumber, Client, Product
FROM Orders
WHERE NOT (Product = 'product_1' AND Client = 'Client_a')