Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

SQL - nie wyświetlaj wiersza, gdy spełnione są dwa kryteria

Dzieje się tak ze względu na sposób, w jaki NOT IN Pracuje. Jeśli którakolwiek z wartości na liście jest NULL, nie zwróci żadnych wyników. np.

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

Nie zwróci żadnych wyników, a nie 3.

Jeśli rozwiniesz przykład do równoważnej instrukcji OR, zobaczysz, dlaczego:

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

Ponieważ 3 != NULL Zwraca wartość false, ponieważ nic nie jest równe NULL, instrukcja zwraca wartość false.

Możesz osiągnąć wymagany wynik na 3 sposoby.

1) Użyj ELSE w instrukcji przypadku, aby upewnić się, że nie ma NULL wyniki

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

2) Zmień IN nie równe, ponieważ instrukcja case i tak zwróci tylko 1 wartość

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

3) Popraw swoją logikę, można to przepisać jako

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Funkcja TSQL do obliczania 30 dni ROBOCZYCH Data od określonej daty (SQL Server 2005)

  2. Ten prosty kod powoduje zakleszczenie. Zawiera prosty przykładowy program

  3. Pobierz obraz z bazy danych w asp.net

  4. Wybierz część kolumny

  5. Zwróć wszystkie klucze obce, które odwołują się do danej tabeli w SQL Server