2017-09-29 4 views
0

私は、整数値を持つテーブルを持っていると私は、列の合計で照会する必要があります。mysqlはifnull(...)インデックスの使用を妨害しますか?

id, A, B, C 
    1, 21, 32, null 
    2, 9, 0, 124 
    3, null, null, 6 

SELECT * FROM tbl WHERE B+C > 50 

ヌルと追加が許可されていないので、これは動作しません。

id, A, B, C, A_null, B_null, C_null 
1, 21, 32, 0, false, false, true 
2, 9, 0, 124, false, false, false 
3, 0, 0, 6, true, true, false 

私は、これは非常に洗練されてないと思いますし、使用したいと思い:現在の実装では、すべて0にNULLを設定し、0が実際にnullを意味している場合の状態に列ごとに別の列を追加することですifnull関数の代わりに:

SELECT * FROM tbl WHERE ifnull(B,0)+ifnull(C,0) > 50 

これには大きなパフォーマンス上のペナルティまたは他の欠点がありますか?

テーブルには、数百万行があります。

+0

とにかく 'where b + c> 50'を検索するためにインデックスを使うことはできません(より正確には、インデックスをスキャンするために使うこともできますし、カバーするインデックスであれば使用するかもしれませんが、その条件のすべての行)。あなたの計算に 'ifnull'(実際には 'coalesce()')を使っても問題ないでしょう。 nullの場合は、絶対に列を追加しないでください! – Solarflare

答えて

0

あなたはいつもこれがnull値に0を挿入します

isnull(column_name ,0) 

を使用することができますし、それはあなたがそれらを合計することができます。

ifnullとisnullの違い - ifnullは2つの引数をとります。値がnullの場合は1つ、isntの場合は1つです。

isnullは、単にこの質問のためにもっと簡単であると思ったすべてのnull値に値を挿入するだけです。

+0

ifnullとの違いは何ですか? – Chris

+0

ドキュメントによると、isnullは1つの引数しか取らず、trueまたはfalseを返します。だから、ifnullの代わりにはない – Chris

+0

@Chrisはい私の答えを更新しました –

関連する問題