起初我以为我可以在查询的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
答案 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'
;