使用CASE添加到WHERE子句条件

时间:2017-06-14 18:24:19

标签: sql sql-server case

我有一个接受可选的@ID参数的存储过程。传递参数时,我希望WHERE语句包含类似id = @ID的内容,否则,当@ID为null时,我不希望它被过滤。

例如:

@ID BIGINT = NULL

SELECT * from myTable
WHERE 
CASE
    WHEN @ID IS NOT NULL THEN mytable.id = @ID
END

我在SQL server 2016中运行它,它说mytable.id = @ID附近的语法错误。 CASE可以这种方式使用,还是应该为此尝试不同的SQL方法?

我认为实现此目的的唯一其他选项是在我的存储过程中使用IF条件,但这似乎不可能基于我的搜索。

2 个答案:

答案 0 :(得分:4)

CASE是表达式,而不是语句。它不是用来控制这样的流程,也不会起作用。

你的逻辑必须是这样的。

Where mytable.id = ISNULL(@ID, mytable.id)

我应该提醒您,这种模式可能会导致一些糟糕的表现。有关更详细的说明和其他一些选项,请查看本文。 http://www.sqlinthewild.co.za/index.php/2009/03/19/catch-all-queries/

答案 1 :(得分:0)

糟糕的性能方法是:

WHERE ISNULL(@ID,mytable.id) = mytable.id

性能更好的方法是:

 if(@ID IS NULL)
   select * from ... without the WHERE condition
else
    do your query with the condition mytable.id = @ID

或者在存储过程中动态构建查询,并通过sp_executesql传递参数

执行它

注意:如果表格足够小,请坚持简单并使用第一个选项。