2017-07-31 10 views
0

ようなクエリ:なぜ言語制御文をプログラミングする代わりにCASE WHENを使用するのですか?

query = "SELECT user_id FROM users WHERE lang = %s ORDER BY CASE WHEN %s <> NULL THEN location <-> %s ELSE RANDOM() END LIMIT 1" 
query(query, lang, location, location) 

は(のpythonを使用して)のように書くことができます:それはこのような何かを行うことは可能だとき

location = ... 
order = "RANDOM()" if location is None else "location <-> %s" 
order_args = [] if location is None else [location] 
query = "SELECT user_id FROM users WHERE lang = %s ORDER BY "+order+" LIMIT 1" 
query(query, lang, *order_args) 

はなぜ、 "CASE" SQLこの場合に使用する必要があります、SQLインジェクションから安全でクエリをきれいに保つことができますか? プロとコントロにはいくつかありますか?

クエリにCASEがはるかに多い場合は、よりクリーンなソリューションになる可能性があります。

+0

データベースは、 'order by'を行うほうがはるかに高速です。特に、このクエリの元のバージョンは1行しか返しませんでした。データベースとアプリケーションの間で余分なデータ移動を行わないことに大きな節約があります。 –

+0

@GordonLinoff申し訳ありませんが、私はいくつかのエラーを修正してメッセージを編集しました。はい、私は1行のために私のクエリを制限しました(私も今も追加)しかし、私の質問はより一般的でした:なぜ私は "ピース"を追加するためにフォーマットするPython文字列を使用することができます非常に長いSQL文字列を書く "ケース" SQLを使用する必要があります文字列?最終結果は非常に同じクエリであり、より読みやすくする必要があります – 91DarioDev

+0

https://dba.stackexchange.com/questions/160237/does-it-make-sense-to-have-case-end-in-an-order- 〜によって – joanolo

答えて

1

クエリを動的に作成することは、SQLインジェクションに注意している限り、健全な戦略です。しかし、通常、データベースエンジンに作業をさせる方が簡単です。データベースエンジンは、特定のシナリオに応じて、クエリをキャッシュし、その他の有用な処理を行うことができます。

動的クエリを使用する必要があるのは、データベースエンジンがスキーマやオブジェクト名、または句全体の有無(ORDER BY、LIMIT、そう)。残りの時間は、個人的な好み/判断です。

関連する問題