Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SQL - não exibe linha quando dois critérios são atendidos


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