Това се дължи на начина, по който NOT IN
върши работа. Ако някоя от стойностите в списъка е NULL, тогава няма да върне резултати. напр.
SELECT [TestColumn] = 3
WHERE 3 NOT IN (1, 2, NULL)
Няма да върне резултати, а не 3.
Ако разширите примера в еквивалентния оператор ИЛИ, ще разберете защо:
WHERE 3 != 1
AND 3 != 2
AND 3 != NULL
Тъй като 3 != NULL
Изчислява се като false, тъй като нищо не е равно на NULL, изразът връща false.
Можете да постигнете желания резултат по 3 начина.
1) Използвайте ELSE
във вашия оператор case, за да гарантирате, че няма NULL
резултати
SELECT OrderNumber, Client, Product
FROM Orders
WHERE Product not in(CASE WHEN client = 'client_a' and product = 'product_1' THEN Product ELSE '' END)
2) Променете IN
да не е равно, тъй като вашият case оператор така или иначе ще върне само 1 стойност
SELECT OrderNumber, Client, Product
FROM Orders
WHERE Product != (CASE WHEN client = 'client_a' and product = 'product_1' THEN Product END)
3) Преразгледайте логиката си, това може да се пренапише като
SELECT OrderNumber, Client, Product
FROM Orders
WHERE NOT (Product = 'product_1' AND Client = 'Client_a')