SQL Server在where子句中添加null

时间:2017-09-06 11:06:10

标签: sql sql-server

我有这些数据:

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

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

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

1 个答案:

答案 0 :(得分:2)

我会使用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