Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在SQL中比较列的NULL或值的有效方法_Sql Server_Tsql_Comparison_Null - Fatal编程技术网

Sql server 在SQL中比较列的NULL或值的有效方法

Sql server 在SQL中比较列的NULL或值的有效方法,sql-server,tsql,comparison,null,Sql Server,Tsql,Comparison,Null,在SQL查询中检查列的null或值的有效方法是什么。考虑一个SQL表表>代码>整数列列< /代码>,它有一个索引。code>@value可以是某个整数或null,例如:16或null select * from table where (@value is null or column = @value) 查询1:不确定,但似乎不应该依赖SQL中的短路。但是,当@value为某个整数或null时,下面的查询始终正常工作 select * from table where (@value is

在SQL查询中检查列的null或值的有效方法是什么。考虑一个SQL表<代码>表>代码>整数列<代码>列< /代码>,它有一个索引。code>@value可以是某个整数或null,例如:16或null

select * from
table
where (@value is null or column = @value)
查询1:不确定,但似乎不应该依赖SQL中的短路。但是,当
@value
为某个整数或null时,下面的查询始终正常工作

select * from
table
where (@value is null or column = @value)
下面的查询是上面查询的扩展版本。它也能正常工作

select * from 
table 
where ((@value is null) 
    or (@value is not null and column = @value))
上述两个查询会利用索引吗

select * from
table
where (column = isnull(@value, column))
查询2:下面的查询将列与非null的
@value
进行比较,否则将列
与其自身进行比较,后者将始终为true并返回所有内容。它也能正常工作。这个查询会利用索引吗

select * from
table
where (column = isnull(@value, column))
最好的办法是什么


注意:如果答案因数据库而异,我对MS-SQL感兴趣

在过去的几天里,这个问题已经出现了好几次变化(为什么这些事情总是集体发生?)。简单的回答是肯定的,如果SQL Server使用已知值创建查询计划,它将使逻辑短路。因此,如果在脚本中设置了变量,那么我认为它应该短路逻辑(测试以确保)。但是,如果它位于存储过程中,那么SQL Server将提前创建查询计划,并且不知道是否可以缩短查询,因为它在生成查询计划时不知道参数值

无论是否短路,如果索引是查询的唯一部分,SQL Server都应该能够使用索引。但是,如果变量为NULL,那么您可能不希望SQL Server使用索引,因为它将毫无用处


如果您在存储过程中,那么最好对查询使用选项(重新编译)。这将导致SQL Server每次都创建一个新的查询计划。这是一点开销,但收益通常会大大超过这一点。这仅适用于SQL 2008,甚至仅适用于某些更高版本的service Pack。在重新编译之前有一个bug,使它变得无用。有关更多信息,请查看Erland Sommarskog关于该主题的文章。具体来说,您需要查看静态SQL部分。

为了澄清一点,SQL并没有我们在基于C的语言中所知道的短路。看起来像短路的实际上是在SQL Server中,三元逻辑TRUE或NULL的计算结果为TRUE

TRUE OR NULL ===> TRUE
TRUE AND NULL ===> NULL
例如:


确定是否使用索引的最佳方法是创建一个包含大量行的测试表,创建索引,并检查查询的查询计划。请注意,查询2不会从列为null的表返回值,因为条件null=null的计算结果为null,而不是true.mark,感谢您指出这一点。列不是空的,所以在这种情况下不会发生这种情况。我已经多次回答了这个问题和各种变体,请尝试:您不必问我是否使用了索引,您自己做吧。只有你有表格和数据。运行:
SET SHOWPLAN\u ALL ON
然后您的查询,查看执行计划,是否使用了索引?可能重复