SQL - 满足两个条件时不显示行

时间:2013-01-16 17:32:08

标签: sql tsql sql-server-2005

起初我以为我可以在查询的WHERE子句中使用CASE(见下文)来完成此操作,但是我在获取所需结果时遇到了一些麻烦。此查询用于获取数据库中客户端的产品信息。如果某个客户订购某个产品,我根本不需要返回行。问题是如果我删除了产品,那么任何其他客户都会显示该产品,因为任何客户都可以订购此产品。我很难理解如何实现这一目标。

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

希望看到这样的结果,重点是为除client_a之外的所有客户端显示product_1:

ordernumber client          product
123         client a    product 2
456         client b    product 1
789         client b    product 2

4 个答案:

答案 0 :(得分:2)

我认为你过于复杂的事情非常简单,不要只是想要:

SELECT
   OrderNumber, Client, Product 
FROM Orders
WHERE Product != 'product_1' 
  AND client = 'client_a'

答案 1 :(得分:2)

这是因为NOT IN的工作方式。如果列表中的任何值为NULL,则它将不返回任何结果。 e.g。

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

不会返回任何结果,而不是3。

如果将示例扩展为等效的OR语句,您将看到原因:

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

由于3 != NULL求值为false,因为没有等于NULL,语句返回false。

您可以通过3种方式完成所需的结果。

1)在案例陈述中使用ELSE以确保没有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更改为不相等,因为您的案例陈述无论如何都只返回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')

答案 2 :(得分:1)

SELECT OrderNumber, Client, Product
FROM Orders
WHERE Client <> 'client_a' OR Product <> 'product_1'

或者,在语义上等效,也许更容易理解为什么这样做:

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

答案 3 :(得分:1)

试试这个:

SELECT OrderNumber, Client, Product
FROM Orders
WHERE Client != 'client_a' 
OR Product != 'product_1'
;