Esto se debe a la forma NOT IN
obras. Si alguno de los valores de la lista es NULL, no devolverá ningún resultado. por ejemplo
SELECT [TestColumn] = 3
WHERE 3 NOT IN (1, 2, NULL)
No devolverá resultados, y no 3.
Si expande el ejemplo en la declaración OR equivalente, verá por qué:
WHERE 3 != 1
AND 3 != 2
AND 3 != NULL
Desde 3 != NULL
Se evalúa como falso ya que nada es igual a NULL, la declaración devuelve falso.
Puede lograr el resultado requerido de 3 maneras.
1) Usa ELSE
en su declaración de caso para asegurarse de que no NULL
resultados
SELECT OrderNumber, Client, Product
FROM Orders
WHERE Product not in(CASE WHEN client = 'client_a' and product = 'product_1' THEN Product ELSE '' END)
2) Cambiar IN
a no igualar, ya que su declaración de caso solo devolverá 1 valor de todos modos
SELECT OrderNumber, Client, Product
FROM Orders
WHERE Product != (CASE WHEN client = 'client_a' and product = 'product_1' THEN Product END)
3) Revisa tu lógica, esto se puede reescribir como
SELECT OrderNumber, Client, Product
FROM Orders
WHERE NOT (Product = 'product_1' AND Client = 'Client_a')