2017-09-06 116 views
2

我有這樣的數據:SQL Server添加在空where子句

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

不過,我看到,在一個WHERE條款使用ISNULL當SQL Server無法使用索引。

這是真的嗎?我還有什麼其他選擇?

+0

問題是什麼?你使用了'ISNULL'並且需要很長時間?此外,所有這些列索引? – sagi

+0

無論如何SQL Server將無法使用索引搜索,因爲您正在對列執行添加。這是一個完整的掃描,如果所有值都被編入索引,可能是索引,但它不是索引查找。 – dasblinkenlight

+0

在我這邊是壞思想過程..當然,指數無論如何也無濟於事。所以我想ISNULL或者COALESCE不會損害整體性能,而不是使用它。 – Chris

回答

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

你使用COALESCE而不是ISNULL的原因是什麼? – Cosmin

+0

@Cosmin。 。 。這是ANSI標準功能。我意識到'ISNUL()'在某些情況下更有效率,但這不是其中之一。 –

+0

@Cosmin我想你會發現'COALESCE'是更標準的解決方案 - 它是ANSI標準。 – Manngo