2014-10-20 60 views
0
CREATE PROCEDURE [dbo].[SPPeople] 
(
    @Name varchar(50) = null, 
    @Status1 char(1) = '0', 
    @Status2 char(1) = '0', 
    @Status3 char(1) = '0' 
) 
as 
    SELECT 
     People.Name, People.Age 
    FROM 
     People 
    WHERE 
     (People.Name = CASE WHEN @Name is null THEN People.Name ELSE @Name END) 
     AND 
     ((People.Status1 = CASE WHEN @Status1 = '0' THEN People.Status1 ELSE @Status1 END) 
     OR 
     (People.Status2 = CASE WHEN @Status2 = '0' THEN People.Status2 ELSE @Status2 END) 
     OR 
     (People.Status3 = CASE WHEN @Status3 = '0' THEN People.Status3 ELSE @Status3 END)) 

如果參數@Status1@Status2等於1,查詢應該返回一定Status1Status2等於1,不依賴於Status3寄存器。在SQL SELECT查詢,其中參數1或參數2

但是,當我通過@Status1@Status2作爲1時,上面的查詢返回所有寄存器。

+0

這是否查詢執行?它似乎缺少最後一行之前的布爾條件(狀態2和狀態3之間) – AHiggins 2014-10-20 18:24:33

+0

它確實缺失。我添加了'OR',以便執行。 – 2014-10-20 18:47:45

回答

2

嘗試使用這種邏輯來代替:

SELECT p.Name, p.Age 
FROM People p 
WHERE (@Name is null OR p.Name = @Name) AND 
     (@status1 <> '0' and p.Status1 = @status1 or 
     @status2 <> '0' and p.Status2 = @status2 or 
     @status3 <> '0' and p.Status3 = @status3 
    ); 

大多數人覺得它更難以理解比布爾邏輯where子句中case表達式。

+0

這個邏輯唯一的問題是,如果我通過所有狀態等於'0'查詢應選擇所有寄存器,而不是沒有。 – 2014-10-20 18:43:34

+0

@EduardoMoreira,您可以隨時在您的WHERE子句中添加「@ Status1 + @ Status2 + @ Status3 = 0 OR ...」,並將其他所有內容放在另一組圓括號中。 – AHiggins 2014-10-20 19:00:01

1

我想你可以修改你的WHERE條件直接比較反對參數一樣

WHERE 
People.Name = @Name 
AND 
(
People.Status1 = @Status1 
OR 
People.Status2 = @Status2 
OR 
People.Status3 = @Status3 
)