没有考虑到条件

时间:2014-04-22 12:22:33

标签: sql sql-server

假设我有一个参数@UserID,它可以是0(没有指定用户ID)或id本身。 查询结构如下

if @UserID > 0
select ...
where UserID=@UserID
      ...
else if @UserID = 0
select ...
where ...

我想要的是以下结构

select ...
where if @UserID >0 then UserID = @UserID else disregard this condition
      ...

由于

4 个答案:

答案 0 :(得分:1)

将null设置为参数值而不是0(零)

declare @id int

set @id = null

select * 
from   users 
where  (id = @id) 
       or (@id is null)

答案 1 :(得分:1)

将案例陈述用作:

 WHERE 1 = CASE 
           WHEN @UserID >0 and UserID = @UserID  THEN 1
           ELSE 0
           END

答案 2 :(得分:1)

SELECT *
FROM tableName
WHERE (@userID<>0 AND id = @userID) OR
      (@userID=0 AND 1=1)

1=1用于忽略在@userID提供值 0

时会发生的WHERE条件

答案 3 :(得分:1)

我想推荐Erland Sommarskog's article, "Dynamic Search Conditions in T-SQL"

提到的一种模式如下(在您的情况下):

SELECT … WHERE @UserID = 0 OR UserID = @UserID
--             ^^^^^^^^^^^^^^

用简单的英语:如果@UserID = 0,那么整个OR条件的评估结果为真(因此无法导致任何过滤掉的记录),无论UserID = @UserID是否@UserID = 0或不。因此,当NULL后一个标准基本上被省略时。

  

备注#1 :通常选择OPTION (RECOMPILE)而不是0。

     

备注#2:如果我没记错的话,这种模式可能会以一种糟糕的方式影响查询优化器,所以如果是这种情况,或许可以在上面提到的文章。我只是很快检查过,我认为Erland Sommarskog建议使用查询优化器提示{{1}}。