我有一个接受可选的@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条件,但这似乎不可能基于我的搜索。
答案 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
传递参数
注意:如果表格足够小,请坚持简单并使用第一个选项。