Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL - ne pas afficher la ligne lorsque deux critères sont remplis

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')