2017-09-06 25 views
2

にnullを追加し、私は、このデータを持っている:SQL Serverは、where句

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

私はval1-4の追加数が一定のしきい値を超えているすべての行を選択します。ただし、列はNULL可能です。だから、これは動作しません:私は使用することができ

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

ISNULLの代わりにCOALESCEを使用した理由は何ですか? – Cosmin

+0

@ Cosmin。 。 。 ANSI標準機能です。私は 'ISNUL()'がある状況下ではより効率的だと認識していますが、これはその一つではありません。 –

+0

@Cosmin私は、COALESCEがより標準的な解決策であることがわかります。これはANSI標準にあります。 – Manngo