Detta beror på sättet NOT IN
Arbetar. Om något av värdena i listan är NULL kommer det inte att returnera några resultat. t.ex.
SELECT [TestColumn] = 3
WHERE 3 NOT IN (1, 2, NULL)
Returnerar inga resultat och inte 3.
Om du utökar exemplet till motsvarande OR-sats kommer du att se varför:
WHERE 3 != 1
AND 3 != 2
AND 3 != NULL
Eftersom 3 != NULL
Utvärderas till false eftersom ingenting är lika med NULL och satsen returnerar false.
Du kan uppnå det önskade resultatet på tre sätt.
1) Använd ELSE
i ditt fallförklaring för att säkerställa att ingen NULL
inte finns resultat
SELECT OrderNumber, Client, Product
FROM Orders
WHERE Product not in(CASE WHEN client = 'client_a' and product = 'product_1' THEN Product ELSE '' END)
2) Ändra IN
inte lika, eftersom din case-sats ändå bara returnerar 1 värde
SELECT OrderNumber, Client, Product
FROM Orders
WHERE Product != (CASE WHEN client = 'client_a' and product = 'product_1' THEN Product END)
3) Revidera din logik, denna kan skrivas om som
SELECT OrderNumber, Client, Product
FROM Orders
WHERE NOT (Product = 'product_1' AND Client = 'Client_a')