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);

なんてコードを書けば望んだように動くしスッキリもしてるのだが…。なんかインジェクション攻撃喰らってるみたいでやだなー。