動的にSQLを組み立てない、というのはRDBを扱う上で鉄則と言えましょう。
- SQLインジェクションを防ぐため
- コンパイルのオーバーヘッドを避けるため
などとは言いますが、何よりもプログラムをランタイムに動的生成するということ自体に本能的な嫌悪感を感じます。たとえ組み立てをしてくれるのがフレームワークであっても。
さて、とはいえ動的SQL組み立てがどうしても避けられないシーンが、意外に日常的なタスクで出てきます。
それは、 複数の検索項目をもつ検索フォーム です。
項目になにかユーザー入力があればそれは絞込対象なのでWHERE句にAND条件追加、とせざるを得ません(それをフレームワークに任すとしても)。
あくまでプリペアドステートメントで表現しようと(:mail_cond IS NULL OR mail like :mail_cond + '%')
なんて書いてみたこともありますが、「あわよくば適切なインデックスをつかってくれ」という望みが完全に絶たれるんですよね。
複数の検索項目をもつ検索フォーム、皆様はどのようにプログラミングなさっているでしょうか。ご意見お聞かせください。