Dzieje się tak ze względu na sposób, w jaki NOT IN
Pracuje. Jeśli którakolwiek z wartości na liście jest NULL, nie zwróci żadnych wyników. np.
SELECT [TestColumn] = 3
WHERE 3 NOT IN (1, 2, NULL)
Nie zwróci żadnych wyników, a nie 3.
Jeśli rozwiniesz przykład do równoważnej instrukcji OR, zobaczysz, dlaczego:
WHERE 3 != 1
AND 3 != 2
AND 3 != NULL
Ponieważ 3 != NULL
Zwraca wartość false, ponieważ nic nie jest równe NULL, instrukcja zwraca wartość false.
Możesz osiągnąć wymagany wynik na 3 sposoby.
1) Użyj ELSE
w instrukcji przypadku, aby upewnić się, że nie ma NULL
wyniki
SELECT OrderNumber, Client, Product
FROM Orders
WHERE Product not in(CASE WHEN client = 'client_a' and product = 'product_1' THEN Product ELSE '' END)
2) Zmień IN
nie równe, ponieważ instrukcja case i tak zwróci tylko 1 wartość
SELECT OrderNumber, Client, Product
FROM Orders
WHERE Product != (CASE WHEN client = 'client_a' and product = 'product_1' THEN Product END)
3) Popraw swoją logikę, można to przepisać jako
SELECT OrderNumber, Client, Product
FROM Orders
WHERE NOT (Product = 'product_1' AND Client = 'Client_a')