2017-02-15 41 views
0

选择行我有一个表是这样的:有一个或另一个条件或两者相结合

Name Candy Fruits 
_____________________ 
John  1  2 
Luis  0  1 
Mary  1  1 
Julio 0  0 

我试图做的是要过滤这些信息,谁刚刚糖果的人:John, MaryJohn, Luis, Mary

我曾尝试是这样的: 或者只是谁拥有水果的人

DECLARE @wCandy BIT, @wFruits BIT 
SET @wCandy = 1, @wFruits = 0 

SELECT Name, Candy, Fruits 
    FROM People 
WHERE (
     (@wCandy = 0) OR (Candy > 0)) 
     AND ((@wFruits = 0) OR (Fruits > 0)) 
     ) 

这导致这(只是人们woth大于0的糖果):

Name Candy Fruits 
_____________________ 
John  1  2 
Mary  1  1 

因此,如果我设置@wCandy = 0@wFruits = 1我应该看到水果数量超过0的人,反之亦然@wCandy设置为1

这很有效,但还有另外一种情况,我想要两种,即糖果和水果。其结果应该是:

Name Candy Fruits 
_____________________ 
John  1  2 
Luis  0  1 
Mary  1  1 

我已经尝试了很多像使用CASE语句的东西,但我还没有得到它的工作。我希望有人能帮帮忙。

+0

目前还不清楚是什么原因你在这里。你只是设置你的糖果变量,而不是设置水果变量?如果是这样,你的水果变量将为NULL,不会被返回。 –

+0

@SeanLange呃,对不起。请看我的编辑! – geekth

+0

要覆盖所有情况,您应该添加一个拥有Candy且没有水果的用户。 – McNets

回答

0

如果你需要有糖果的所有用户+有水果+有糖果和水果所有用户的所有用户,使用UNION:

SELECT Name, Candy, Fruits FROM People WHERE Candy > 0 
UNION 
SELECT Name, Candy, Fruits FROM People WHERE Fruits > 0 
UNION 
SELECT Name, Candy, Fruits FROM People WHERE Fruits > 0 AND Candy > 0 

+------+-------+--------+ 
| Name | Candy | Fruits | 
+------+-------+--------+ 
| John | 1 | 2 | 
+------+-------+--------+ 
| Luis | 0 | 1 | 
+------+-------+--------+ 
| Mary | 1 | 1 | 
+------+-------+--------+ 

这里检查它:http://rextester.com/VHMV68063

+0

是的,但我需要三种不同的情况! 1:只有水果,2:只有糖果,3:糖果+水果 – geekth

+0

添加另一个联合,但结果是一样的 – McNets

+0

UNION有一个隐含的DISTINCT – McNets

0

我只是猜测,鉴于你收到的其他答案和你的回应... 你的意思是这样的吗?

SELECT P.Name, P.Candy, P.Fruits 
    FROM People P 
    WHERE 
     (
      (
      @wCandy = 1 
      AND P.Candy >= 1 
      ) 
      OR 
      (
      @wCandy = 0 
      AND P.Candy = 0 
      ) 
     ) 
     AND 
     (
      (
      @wFruits = 1 
      AND P.Fruits >= 1 
      ) 
      OR 
      (
      @wFruits = 0 
      AND P.Fruits = 0 
      ) 
     ) 
; 

这给你正确的过滤器无论在什么条件你输入...

  1. 人们只用糖果
  2. 人们只用水果
  3. 人们以水果和糖果
  4. 没有水果,没有糖果的人
相关问题