2013-01-16 88 views
0

起初我以为我可以在我的查询的WHERE子句中完成此操作,并使用CASE(请参见下文),但我在获取需要的结果时遇到了一些麻烦。此查询将获取数据库中客户端的产品信息。如果某个产品是由某个客户订购的,我根本不需要返回行。问题是,如果我删除了该产品,那么任何其他具有该产品的客户都将显示出来,因为任何客户都可以订购该产品。我很难完成这个任务。SQL - 当满足两个条件时不显示行

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

希望看到这样的结果,问题的关键是,以示对所有客户product_1除了client_a:

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

你ou你有没有收到? – Woot4Moo

+0

基本上与上面相同,但添加一行显示客户端与产品1 – wondergoat77

回答

2

这是因为该方式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计算结果为假,因为没有等于NULL语句返回false。

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

1)在你的case语句使用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') 
+0

我看到所有这一切背后的逻辑,但它不适用于我的查询。显然我发布了一个通用查询,所以它可能是我的查询中的东西。生病看我能否解决它,否则生病发表编辑 – wondergoat77

+0

没关系,是一个数字在我的查询1位数字,这有效奇迹,谢谢! – wondergoat77

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') 
1

试试这个:

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

我想你了复杂的东西很简单,你不只是想:

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