1回目だけ特別
仕事中に相談を受けた。SQLと呼ばれるDBアクセス言語を文字列で生成したいわけなんだけど、フラグによって条件づけを変えたい。例を挙げると
String strSql = "SELECT " " * " "FROM " " SAMPLE_TABLE " "WHERE " " FOO = 'ふー' "; if( hogeFlag ) strSql += "AND HOGE='ほげ' "; if( hugaFlag ) strSql += "AND HUGA='ふが' "; if( piyoFlag ) strSql += "AND PIYO='ぴよ' "; ExecSQL(strSql);
みたいな。
仕事でやってれば一度は書いたことがあるであろう、あるあるコードだ。やりたいこととしては、SAMPLE_TABLEからFOO='ふー'の条件でデータをとってくる。もし、hogeフラグが立っていたら、HOGE='ほげ'を条件に加える。hugaフラグ、piyoフラグが立ってたら同様にするし、hogeかつhugaならば、HOGE='ほげ'かつHUGA='ふが'を条件に加える。
簡単なコードなんだけど、今回の要件としては、デフォルトのクエリーに条件が無い。つまり、SAMPLE_TABLEから全てのデータを取得して、フラグが立ってたらhoge,huga,piyoを条件に加える、みたいな。
SQLを組むとき、条件なしの場合はWHERE句を入れてはいけない。逆に、条件を含める場合にはWHERE句を入れなければならない。そのため、hoge,huga,piyo条件が無い時はWHERE句を抜かなければならないし、hoge,huga,piyoの何れかが立っているときは、その1発目にWHERE句を入れなければならない(そして、ANDで結合しなければならないのもいやらしい)。
こういうの、スッキリ書くにはどうしたらいいんだー。なんか定石とかあったりしないだろーか。誰に聞いても「そーだなー。ほぇあフラグを別に設定してスイッチしたら…」とか口を揃えられるし。そんな泥臭いのヤダー。
いちおう、
String strSql = "SELECT " " * " "FROM " " SAMPLE_TABLE " "WHERE " " 1=1 "; if( hogeFlag ) strSql += "AND HOGE='ほげ' "; if( hugaFlag ) strSql += "AND HUGA='ふが' "; if( piyoFlag ) strSql += "AND PIYO='ぴよ' "; ExecSQL(strSql);
なんてコードを書けば望んだように動くしスッキリもしてるのだが…。なんかインジェクション攻撃喰らってるみたいでやだなー。