[Seasar-user:3049] [S2DAO]複雑なSQLの生成
sato
sato
2005年 12月 21日 (水) 11:14:58 JST
お世話になっています。
NSQ@佐藤です。
表題の通り、複雑なSQLを処理する場合の実装方法について教え頂けませんでし
ょうか?
作成したいSQLは以下のような物です。
SELECT *
FROM TEST_TBL
WHERE CITY = ?
AND ( (NAME = ? AND AGE = ?)
OR (NAME = ? AND AGE = ?)
OR (NAME = ? AND AGE = ?)
OR (NAME = ? AND AGE = ?)
・・・省略(Listの数だけループ)
OR (NAME = ? AND AGE = ?)
)
AND (ID,SEQ) IN (SELECT ID,MAX(SEQ)
FROM TEST_TBL
WHERE CITY = ?
AND ( (NAME = ? AND AGE = ?)
OR (NAME = ? AND AGE = ?)
OR (NAME = ? AND AGE = ?)
OR (NAME = ? AND AGE = ?)
・・・省略(Listの数だけループ)
OR (NAME = ? AND AGE = ?)
)
GROUP BY ID
※ここで取得したいデータ
名前(NAME),年齢(AGE)が該当するデータの中でIDに対して最大の履歴(SEQ)をも
つデータのみを取得したい。
このようば場合、バインド変数に対して値を与える良い方法はありますでしょう
か?
SQLコメントでループがないのでSQLの生成は出来なさそうだったので、
StringBuffer sql = new StringBuffer("Where CITY = " + city + " AND (
");
for ( int i=0 ; i<list.size() ; i++ ) {
HogeBean bean = (HogeBean)list.get(i);
sql.append(" OR (NAME = " + bean.getName() + " AND AGE = " + ")");
}
sql.append(" )");
int firstOrIndex = sql.indexOf("OR");
sql.delete(firstOrIntex, firstOrIndes + 2);
として生成した条件を埋め込みたいと考えたのですが、この条件を
SELECT *
FROM TEST_TBL
?
AND (ID,SEQ) IN (SELECT ID,MAX(SEQ)
FROM TEST_TBL
?
として、バインド変数にめ込んだ場合、条件が文字列のためシングルクォーテー
ション(')で囲まれてしまい希望したSQLになりません。
SELECT *
FROM TEST_TBL
'Where CITY = xxx AND XXXX省略'
AND (ID,SEQ) IN (SELECT ID,MAX(SEQ)
FROM TEST_TBL
'Where CITY = xxx AND XXXX省略'
何か良い解決方法はないものでしょうか?
=========================================================
株式会社 ネットスクエア
佐藤 慎也 <E-mail:sato @ net-squares.com>
〒733-0822
広島市西区庚午中4丁目6−1セントラルビル3F
http://www.net-squares.com/
TEL:(082) 507 - 6266
FAX:(082) 507 - 6267
=======================================================
<< ISO文書管理は弊社のISO-SQUAREにお任せ下さい。 >>
=======================================================
Seasar-user メーリングリストの案内