sql >> Databáze >  >> RDS >> Sqlserver

SQL - nezobrazovat řádek, pokud jsou splněna dvě kritéria

Je to kvůli způsobu NOT IN funguje. Pokud je některá z hodnot v seznamu NULL, nevrátí žádné výsledky. např.

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

Vrátí žádné výsledky a ne 3.

Pokud příklad rozšíříte na ekvivalentní příkaz OR, uvidíte proč:

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

Protože 3 != NULL Vyhodnotí se na hodnotu false, protože nic se nerovná NULL, příkaz vrátí hodnotu false.

Požadovaného výsledku můžete dosáhnout 3 způsoby.

1) Použijte ELSE ve vašem případě, abyste zajistili, že nebude NULL výsledky

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

2) Změňte IN nerovná se, protože váš příkaz case stejně vrátí pouze 1 hodnotu

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

3) Upravte svou logiku, lze ji přepsat jako

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


  1. MySQL NAČTE DATA LOKÁLNÍ VSTUPNÍ SOUBOR Python

  2. Mysql_fetch_array( $result, MYSQL_BOTH ) není přesné

  3. Použití fulltextového vyhledávání v SQL Server 2008 ve více tabulkách, sloupcích

  4. Uživatelsky definované funkce MySQL