S2DaoでORが複数の場合の先頭ORの除去
s2daoを使って、
Select From Where column1 = 1 or column1 = 2 or column1 = 3
は、INを使えばよくて
WHERE column1 IN/*dto.strArray*/('100')
http://q.hatena.ne.jp/1176814028
where a in /*a_array*/(0,1,2)
IF文と組み合わせた場合に、先頭のORが残ってしまうような
場合はどうなるのか。
Select From Where /*IF dto.a ="abc"*/ column1 = 1 or column1 = 2 /*END*/ /*IF dto.b ="def"*/ or column1 = 3 /*END*/
のような場合に、最初のIFが成立(true)して次のIFも成立(true)する場合は
問題にならないけど 最初のIFが不成立(false)で次のIFが成立(true)した場合に
or column1 = 3
の OR が残ってしまうじゃないか?
ってことで
column1 に対応する 条件(orとなる値)を
配列にして、IN句に渡せば
先に書いた、
column1 IN/*dto.strArray*/('100')
で対応できるけど、条件を指定するカラムが変わったりすると、この方法は使えない。
S2daoのコメント機能には、
http://s2dao.seasar.org/ja/s2dao.html#SQLBind
BEGINコメントは、WHERE句内のすべてのELSEを含まないIFコメントがfalseになった場合に、
WHERE句自体を出力したくない場合に使います。BEGINコメントはIFコメントと併せて使用します。BEGINコメントは以下の形式で記述します。
- /*BEGIN*/WHERE句/*END*/
というのがある。
WHERE句だけが残ってしまうとSQLの実行エラーとなる。
WHERE句自体を出力しない 機能があるならば
OR も出力しない機能があるかも?ってことで
Select From Where ・・・ /*IF dto.xxx=""*/ AND /*BEGIN*/ /*IF dto.a ="abc"*/ column1 = 1 or column1 = 2 /*END*/ /*IF dto.b ="def"*/ or column1 = 3 /*END*/ /*END*/ /*END*/
/*IF dto.a ="abc"*/ が成立しない(false)で
/*IF dto.b ="def"*/ が成立したら と試してみたら
実行できた! 余分な OR が除去された。
こんな↓感じでできた。
Select From Where ・・・ AND column1 = 3
これはs2daoとして仕様通りの動作なの? それとも たまたまなの?
試したのは、s2dao-1.0.48です。