Dette er på grund af måden NOT IN
arbejder. Hvis nogen af værdierne på listen er NULL, vil den ikke returnere nogen resultater. f.eks.
SELECT [TestColumn] = 3
WHERE 3 NOT IN (1, 2, NULL)
Returnerer ingen resultater og ikke 3.
Hvis du udvider eksemplet til den tilsvarende OR-sætning, vil du se hvorfor:
WHERE 3 != 1
AND 3 != 2
AND 3 != NULL
Siden 3 != NULL
Evalueres til falsk, da intet er lig med NULL, og sætningen returnerer falsk.
Du kan opnå det ønskede resultat på 3 måder.
1) Brug ELSE
i din sagserklæring for at sikre ingen NULL
resultater
SELECT OrderNumber, Client, Product
FROM Orders
WHERE Product not in(CASE WHEN client = 'client_a' and product = 'product_1' THEN Product ELSE '' END)
2) Skift IN
til ikke lig, da din case-opgørelse alligevel kun vil returnere 1 værdi
SELECT OrderNumber, Client, Product
FROM Orders
WHERE Product != (CASE WHEN client = 'client_a' and product = 'product_1' THEN Product END)
3) Revider din logik, denne kan omskrives som
SELECT OrderNumber, Client, Product
FROM Orders
WHERE NOT (Product = 'product_1' AND Client = 'Client_a')