C'est à cause de la façon dont NOT IN
œuvres. Si l'une des valeurs de la liste est NULL, aucun résultat ne sera renvoyé. ex.
SELECT [TestColumn] = 3
WHERE 3 NOT IN (1, 2, NULL)
Ne renverra aucun résultat, et non 3.
Si vous développez l'exemple dans l'instruction OR équivalente, vous comprendrez pourquoi :
WHERE 3 != 1
AND 3 != 2
AND 3 != NULL
Depuis 3 != NULL
Est évalué à faux puisque rien n'est égal à NULL l'instruction renvoie faux.
Vous pouvez obtenir le résultat requis de 3 manières.
1) Utilisez ELSE
dans votre déclaration de cas pour vous assurer qu'il n'y a pas de NULL
résultats
SELECT OrderNumber, Client, Product
FROM Orders
WHERE Product not in(CASE WHEN client = 'client_a' and product = 'product_1' THEN Product ELSE '' END)
2) Changer IN
n'est pas égal, puisque votre instruction case ne renverra de toute façon qu'une seule valeur
SELECT OrderNumber, Client, Product
FROM Orders
WHERE Product != (CASE WHEN client = 'client_a' and product = 'product_1' THEN Product END)
3) Révisez votre logique, cela peut être réécrit comme
SELECT OrderNumber, Client, Product
FROM Orders
WHERE NOT (Product = 'product_1' AND Client = 'Client_a')