Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

SQL - не показвайте ред, когато са изпълнени два критерия

Това се дължи на начина, по който NOT IN върши работа. Ако някоя от стойностите в списъка е NULL, тогава няма да върне резултати. напр.

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

Няма да върне резултати, а не 3.

Ако разширите примера в еквивалентния оператор ИЛИ, ще разберете защо:

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

Тъй като 3 != NULL Изчислява се като false, тъй като нищо не е равно на NULL, изразът връща false.

Можете да постигнете желания резултат по 3 начина.

1) Използвайте ELSE във вашия оператор case, за да гарантирате, че няма NULL резултати

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

2) Променете IN да не е равно, тъй като вашият case оператор така или иначе ще върне само 1 стойност

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

3) Преразгледайте логиката си, това може да се пренапише като

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. Как да получите максималния брой редове за група/дял в SQL Server?

  2. Ограничение за проверка - Подзаявките не са разрешени в този контекст

  3. Изберете група от редове, които съответстват на всички елементи в списъка

  4. Използване на променливи за възходящ и низходящ ред по

  5. C# ASP.Net:Изключение (само понякога) по време на дълга работа с база данни