2017-02-15 75 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. 沒有水果,沒有糖果的人
相關問題