【问题标题】:SQL Server add null in where clauseSQL Server在where子句中添加null
【发布时间】:2017-09-06 19:27:37
【问题描述】:

我有这些数据:

+-----+-------+-------+-------+-------+
|  id |  val1 |  val2 |  val3 |  val4 |
+-----+-------+-------+-------+-------+
|   1 |     5 |  null |     0 |     3 |
+-----+-------+-------+-------+-------+

我想选择 val1-4 的添加计数高于某个阈值的所有行。但是,这些列可以为空。所以这行不通:

SELECT * 
FROM data 
WHERE val1 + val2 + val3 + val4 > 6

我可以使用:

SELECT * 
FROM data 
WHERE ISNULL(val1, 0) + ISNULL(val2, 0) + ISNULL(val3, 0) + ISNULL(val4, 0) > 6

但我读到 SQL Server 在 WHERE 子句中使用 ISNULL 时不能使用索引。

这是真的吗?我还有哪些其他选择?

【问题讨论】:

  • 有什么问题?您是否使用了ISNULL 并且需要很长时间?另外,所有这些列都被索引了吗?
  • SQL Server 无论如何都无法使用索引搜索,因为您正在对列执行添加。这是一个完整的扫描,如果所有值都被索引在一起,可能是一个索引,但它不是索引查找。
  • 是的,我的想法很糟糕。当然索引无论如何也无济于事。所以我猜 ISNULL 或 COALESCE 与不使用相比不会损害整体性能。

标签: sql sql-server


【解决方案1】:

我会使用coalesce():

SELECT *
FROM data
WHERE COALESCE(val1, 0) + COALESCE(val2, 0) + COALESCE(val3, 0) + COALESCE(val4, 0) > 6

当然,由于函数的原因,SQL Server 不能为此使用索引。实际上,它也不能使用带有+ 的索引,所以你并没有丢失任何东西。

如果要使用索引,则在索引上添加计算列和列:

alter table data add total_value as
    (COALESCE(val1, 0) + COALESCE(val2, 0) + COALESCE(val3, 0) + COALESCE(val4, 0)) persisted;

create index idx_data_total_value on data(total_value);

然后将查询表述为:

where total_value > 6

【讨论】:

  • 您有什么理由使用 COALESCE 而不是 ISNULL?
  • @Cosmin 。 . .它是 ANSI 标准功能。我意识到ISNUL() 在某些情况下效率更高,但这不是其中之一。
  • @Cosmin 我想你会发现COALESCE 是更标准的解决方案——它在 ANSI 标准中。
猜你喜欢
  • 1970-01-01
  • 2017-07-20
  • 1970-01-01
  • 2016-10-07
  • 2019-06-26
  • 2010-10-23
  • 2014-02-14
  • 1970-01-01
  • 2021-08-09
相关资源
最近更新 更多