Sql 不考虑条件

Sql 不考虑条件,sql,sql-server,Sql,Sql Server,假设我有一个参数@UserID,它可以是0,没有分配UserID,也可以是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

假设我有一个参数@UserID,它可以是0,没有分配UserID,也可以是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
      ...

谢谢

将null设置为参数值,而不是0

declare @id int

set @id = null

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

将null设置为参数值,而不是0

declare @id int

set @id = null

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

将案例陈述用作:

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

将案例陈述用作:

 WHERE 1 = CASE 
           WHEN @UserID >0 and UserID = @UserID  THEN 1
           ELSE 0
           END
1=1用于忽略WHERE条件,如果@userID的值为0,则会发生这种情况

1=1用于忽略WHERE条件,如果为@userID提供值0,则会发生这种情况

您的案例中提到的一种模式如下:

SELECT … WHERE @UserID = 0 OR UserID = @UserID
--             ^^^^^^^^^^^^^^
简而言之:如果@UserID=0,则整个OR条件的计算结果为true,因此无论UserID=@UserID与否,都不会导致任何记录被过滤掉。因此,当@UserID=0时,后一个标准基本上被忽略

备注1:通常选择NULL而不是0

备注2:如果我没记错的话,这种模式可能会对查询优化器产生不好的影响,因此如果您是这样的话,也许可以在上面提到的文章中阅读一下。我只是很快地进行了检查,我认为Erland Sommarskog建议使用查询优化器提示选项重新编译

我想推荐

您的案例中提到的一种模式如下:

SELECT … WHERE @UserID = 0 OR UserID = @UserID
--             ^^^^^^^^^^^^^^
简而言之:如果@UserID=0,则整个OR条件的计算结果为true,因此无论UserID=@UserID与否,都不会导致任何记录被过滤掉。因此,当@UserID=0时,后一个标准基本上被忽略

备注1:通常选择NULL而不是0

备注2:如果我没记错的话,这种模式可能会对查询优化器产生不好的影响,因此如果您是这样的话,也许可以在上面提到的文章中阅读一下。我只是很快地进行了检查,我认为Erland Sommarskog建议使用查询优化器提示选项重新编译


你能扩展你的答案吗?你能扩展你的答案吗?