hIp*_*pPy 9 t-sql sql-server comparison null
在SQL查询中检查列的空值或值的有效方法是什么.考虑一个table
带有column
索引的整数列的sql表.@value
可以是一些整数或null ex:16或null.
查询1:不确定,但似乎不应该依赖SQL中的短路.但是,当@value
某个整数或null 时,以下查询始终可以正常工作.
select * from
table
where (@value is null or column = @value)
Run Code Online (Sandbox Code Playgroud)
以下查询是上述查询的扩展版本.它也正常工作.
select * from
table
where ((@value is null)
or (@value is not null and column = @value))
Run Code Online (Sandbox Code Playgroud)
以上2个查询是否会利用索引?
查询2:下面的查询将列与非null @value
进行比较,否则将列column
与其自身进行比较,该列始终为true并返回所有内容.它也正常工作.这个查询会利用索引吗?
select * from
table
where (column = isnull(@value, column))
Run Code Online (Sandbox Code Playgroud)
什么是最好的方式?
注意:如果答案因数据库而异,我对MS-SQL感兴趣.
在过去的几天里,这个问题的变体出现了好几次(为什么这些事情总是成群结队地发生?)。简短的回答是,是的,如果 SQL Server 创建具有已知值的查询计划,它将短路逻辑。因此,如果您在设置变量的脚本中有该代码,那么我相信它应该使逻辑短路(确保测试)。但是,如果是在存储过程中,那么SQL Server会提前创建一个查询计划,并且它不知道是否可以短路查询,因为它不知道生成时的参数值查询计划。
不管它是否短路,如果索引是查询的唯一部分,那么 SQL Server 应该能够使用该索引。如果变量为 NULL,那么您可能不希望 SQL Server 使用索引,因为它是无用的。
如果您使用存储过程,那么最好的选择是在查询中使用 OPTION (RECOMPILE)。这将导致 SQL Server 每次创建一个新的查询计划。这是一点点开销,但收益通常会超过它很多。这仅适用于 SQL 2008,甚至仅适用于某些更高版本的服务包。在此之前,RECOMPILE 存在一个错误,导致其无用。欲了解更多信息,请查看 Erland Sommarskog关于该主题的精彩文章。具体来说,您需要查看静态 SQL 部分。