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