当@parm = -1时返回IN,否则返回@parm值

时间:2012-11-30 20:06:24

标签: sql sql-server

我想过滤我的查询但确实知道语法:

这是我的错误语法:

WHERE 
 (@StatusId = - 1 then Status.StatusId IN (1, 2, 3, 4)) 
else 
  Status.StatusId = @StatusId)

3 个答案:

答案 0 :(得分:1)

WHERE
(@StatusId = -1 AND Status.StatusID IN (1,2,3,4))
OR
(@StatusId <> -1 AND Status.StatusID = @StatusId)

请注意,如果@StatusId为null,@StatusId <> -1将返回false。我假设只有在@StatusId不等于-1时才会发生相等检查。如果情况并非如此,那么您可以从第二个子句中删除该部分。

答案 1 :(得分:0)

您需要使用布尔逻辑。试试这个:

WHERE 
 ((@StatusId = - 1 AND Status.StatusId IN (1, 2, 3, 4)) OR Status.StatusId = @StatusId)

请注意,整个语句在括号中。

答案 2 :(得分:0)

你可以这样做,但它可能导致查询性能问题这样做(搜索参数嗅探)。最好是根据@StatusID的值动态生成正确的SQL,并且只运行您需要的位。

Where (
  @StatusID = -1 And 
  Status.StatusID In (1, 2, 3, 4)
) Or (
  @StatusID != -1 And
  Status.StatusID = @StatusID
)