kuniku’s diary

はてなダイアリーから移行(旧 d.hatena.ne.jp/kuniku/)、表示がおかしな箇所はコメントをお願いします。記載されている内容は日付およびバージョンに注意してください。直近1年以上前は古い情報の可能性が高くなります。

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です。