Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

SQL:non visualizza la riga quando vengono soddisfatti due criteri

Ciò è dovuto al modo in cui NOT IN lavori. Se uno qualsiasi dei valori nell'elenco è NULL, non restituirà alcun risultato. es.

SELECT  [TestColumn] = 3
WHERE   3 NOT IN (1, 2, NULL)

Non restituirà alcun risultato e non 3.

Se espandi l'esempio nell'istruzione OR equivalente vedrai perché:

WHERE   3 != 1
AND     3 != 2
AND     3 != NULL

Poiché 3 != NULL Restituisce false poiché nulla è uguale a NULL l'istruzione restituisce false.

Puoi ottenere il risultato richiesto in 3 modi.

1) Usa ELSE nella tua dichiarazione del caso per garantire che non sia NULL risultati

SELECT  OrderNumber, Client, Product
FROM    Orders
WHERE    Product not in(CASE WHEN client = 'client_a' and product = 'product_1' THEN Product ELSE '' END)

2) Cambia IN a non uguale, poiché l'istruzione case restituirà comunque solo 1 valore

SELECT  OrderNumber, Client, Product 
FROM    Orders
WHERE   Product != (CASE WHEN client = 'client_a' and product = 'product_1' THEN Product END)

3) Rivedi la tua logica, questa può essere riscritta come

SELECT  OrderNumber, Client, Product 
FROM    Orders
WHERE   NOT (Product = 'product_1' AND Client = 'Client_a')