我有这些数据:
+-----+-------+-------+-------+-------+
| 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无法使用索引。
这是真的吗?我还有其他选择吗?
答案 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