繁体   English   中英

使用CASE添加到WHERE子句条件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM