[英]Adding to WHERE clause conditions using 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条件,但根据我的搜索似乎也不可能。
CASE是一个表达式,而不是一个语句。 它不能像这样控制流量,它将无法工作。
您的逻辑将需要像这样。
Where mytable.id = ISNULL(@ID, mytable.id)
我应该警告您,这种模式可能会导致性能下降。 有关更详细的解释和其他选项,请查看本文。 http://www.sqlinthewild.co.za/index.php/2009/03/19/catch-all-queries/
效果不佳的方法是:
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
或者在存储的proc中动态构建查询,并通过sp_executesql
传递参数来执行查询
注意:如果表格足够小,请保持简洁并使用第一个选项。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.