Je to kvůli způsobu NOT IN
funguje. Pokud je některá z hodnot v seznamu NULL, nevrátí žádné výsledky. např.
SELECT [TestColumn] = 3
WHERE 3 NOT IN (1, 2, NULL)
Vrátí žádné výsledky a ne 3.
Pokud příklad rozšíříte na ekvivalentní příkaz OR, uvidíte proč:
WHERE 3 != 1
AND 3 != 2
AND 3 != NULL
Protože 3 != NULL
Vyhodnotí se na hodnotu false, protože nic se nerovná NULL, příkaz vrátí hodnotu false.
Požadovaného výsledku můžete dosáhnout 3 způsoby.
1) Použijte ELSE
ve vašem případě, abyste zajistili, že nebude NULL
výsledky
SELECT OrderNumber, Client, Product
FROM Orders
WHERE Product not in(CASE WHEN client = 'client_a' and product = 'product_1' THEN Product ELSE '' END)
2) Změňte IN
nerovná se, protože váš příkaz case stejně vrátí pouze 1 hodnotu
SELECT OrderNumber, Client, Product
FROM Orders
WHERE Product != (CASE WHEN client = 'client_a' and product = 'product_1' THEN Product END)
3) Upravte svou logiku, lze ji přepsat jako
SELECT OrderNumber, Client, Product
FROM Orders
WHERE NOT (Product = 'product_1' AND Client = 'Client_a')