Isso se deve ao modo como
NOT IN
funciona. Se algum dos valores na lista for NULL, não retornará nenhum resultado. por exemplo. SELECT [TestColumn] = 3
WHERE 3 NOT IN (1, 2, NULL)
Não retornará nenhum resultado, e não 3.
Se você expandir o exemplo para a instrução OR equivalente, verá o porquê:
WHERE 3 != 1
AND 3 != 2
AND 3 != NULL
Desde
3 != NULL
Avalia como false, pois nada é igual a NULL, a instrução retorna false. Você pode obter o resultado desejado de 3 maneiras.
1) Use
ELSE
em sua instrução case para garantir que nenhum 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) Altere
IN
para não igual, já que sua instrução case retornará apenas 1 valor de qualquer maneira SELECT OrderNumber, Client, Product
FROM Orders
WHERE Product != (CASE WHEN client = 'client_a' and product = 'product_1' THEN Product END)
3) Revise sua lógica, isso pode ser reescrito como
SELECT OrderNumber, Client, Product
FROM Orders
WHERE NOT (Product = 'product_1' AND Client = 'Client_a')