【发布时间】: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