2012-05-09 15 views
4

WHERE句とNULL値で複数の条件を扱うときのパフォーマンスやベストプラクティスが優れているのでしょうか。MySQLのWHERE句のCASEまたはCOALESCEのパフォーマンス

WHERE 
    u.id = COALESCE(user_id, u.id) AND 
    su.custom_id = COALESCE(student_number, su.custom_id) 

OR

WHERE 
CASE 
    WHEN user_id IS NOT NULL AND LENGTH(user_id) > 0 
    THEN 
     u.id = user_id 
    ELSE 
     su.custom_id = student_number 
    END 
+0

テストした結果は?クエリプランはどのように異なるのですか? –

+0

私はSQL Serverのユーザーですから、セットアップするプロファイラの種類や種類についての知識はMySQLに限られています。 –

+0

Select文の前に[EXPLAIN EXTENDED](http://dev.mysql.com/doc/refman/5.0/en/explain.html)を入れてみてください。 SQL Serverのクエリプランを調べることに慣れていれば、それほど異なって見えません –

答えて

10

これらのアプローチはどちらも避けたいと思います。 ANDORIS NULL、およびカッコを賢明に使用して、実行しようとしていることを達成できるはずです。このよう

WHERE 
    u.id = COALESCE(user_id, u.id) AND 
    su.custom_id = COALESCE(student_number, su.custom_id) 

たとえば、あなたはこれを書き換えることができ

WHERE 
    (user_id IS NULL OR u.id = user_id) AND 
    (su.custom_id = student_number) 

そして、あなたがこの書き換えることができます:

WHERE 
(user_id IS NOT NULL AND LENGTH(user_id) > 0 AND u.id = user_id) 
OR 
(su.custom_id = student_number) 
:このよう

WHERE 
CASE 
    WHEN user_id IS NOT NULL AND LENGTH(user_id) > 0 
    THEN 
     u.id = user_id 
    ELSE 
     su.custom_id = student_number 
    END 

+0

Thx niceソリューション – MSTdev

0

私はexplainを使用することをお勧めして、クエリプランがあるseehowでしょう。 Like:

explain <your select query here> 
+0

これはWorkbenchで動作しますか?何も出力されていませんか? –

+0

使用しているワークベンチのバージョンは?なぜなら、ワークベンチにo/pを示さない説明があるバグがあるからです。 Workbench5.2.38で修正されました。ここをクリックしてください。http://dev.mysql.com/doc/workbench/en/wb-news-5-2-38.html – Rahul

+0

5.2.37は私の現在のバージョンです。 –