Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL - Zeile nicht anzeigen, wenn zwei Kriterien erfüllt sind

Das liegt an der Art NOT IN funktioniert. Wenn einer der Werte in der Liste NULL ist, werden keine Ergebnisse zurückgegeben. z. B.

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

Gibt keine Ergebnisse zurück und nicht 3.

Wenn Sie das Beispiel in die äquivalente ODER-Anweisung erweitern, werden Sie sehen, warum:

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

Seit 3 != NULL Wird als falsch ausgewertet, da nichts gleich NULL ist, gibt die Anweisung falsch zurück.

Sie können das gewünschte Ergebnis auf 3 Arten erzielen.

1) Verwenden Sie ELSE in Ihrem Fall Anweisung, um sicherzustellen, dass kein NULL vorhanden ist Ergebnisse

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

2) Ändern Sie IN auf ungleich, da Ihre Case-Anweisung sowieso nur 1 Wert zurückgibt

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

3) Überarbeiten Sie Ihre Logik, dies kann umgeschrieben werden als

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