代码之家  ›  专栏  ›  技术社区  ›  hIpPy

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

  •  9
  • hIpPy  · 技术社区  · 15 年前

    table 带整数列 column 它有一个索引。 @value 可以是整数或null例如:16或null。

    问题1:不确定,但似乎不应该依赖SQL中的短路。但是,当 @价值 是整数或空值。

    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))
    

    最好的办法是什么?

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

    2 回复  |  直到 12 年前
        1
  •  2
  •   Tom H zenazn    15 年前

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

    如果您在一个存储过程中,那么最好对查询使用OPTION(重新编译)。这将导致SQLServer每次都创建一个新的查询计划。这是一点开销,但收益通常会远远超过这一点。这仅适用于SQL2008,甚至仅适用于某些更高版本的service Pack。在重新编译之前有一个bug使它变得无用。有关更多信息,请查看厄兰索马斯科格的 great article 关于这个问题。具体来说,您需要查看静态SQL部分。

        2
  •  1
  •   user281806    11 年前

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

    TRUE OR NULL ===> TRUE
    TRUE AND NULL ===> NULL
    

    如:

    if 1=null or 1=1 print 'true' else print 'false'
    if 1=null and 1=1 print 'true' else print 'false'