假设我有一个参数@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
...
由于
答案 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
答案 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}}。