1

起初我以为我可以在WHERE查询的子句中使用 a 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

4 回答 4

2

我认为您将非常简单的事情复杂化了,您不只是想要:

SELECT
   OrderNumber, Client, Product 
FROM Orders
WHERE Product != 'product_1' 
  AND client = 'client_a'
于 2013-01-16T17:38:36.100 回答
2

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

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

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

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

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

由于3 != NULLEvaluates 为 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为不等于,因为您的 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')
于 2013-01-16T17:39:20.997 回答
1

尝试这个 :

SELECT OrderNumber, Client, Product
FROM Orders
WHERE Client != 'client_a' 
OR Product != 'product_1'
;
于 2013-01-16T17:37:23.057 回答
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')
于 2013-01-16T17:35:30.313 回答