2014-10-20 80 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 
)