- PR -

DBでMAX関数を使ってSELECTした場合

投稿者投稿内容
nabeママ
常連さん
会議室デビュー日: 2003/04/11
投稿数: 39
投稿日時: 2003-04-15 16:21
こんにちは。またまた続けて投稿させていただきます。

SQLを下記のように書いた場合、

rs = stmt.executeQuery("SELECT MAX(Doc_No) FROM Doc_TB");
rs.next();

で取得したDoc_NoをGETするにはどうすればいいですか?

Get_No= rs.getInt("Doc_No");

では、Get_No の値は 0 でした。

Java初めて日が浅いものですから、こんなことも出来ません。
よろしくお願いします。


[ メッセージ編集済み 編集者: nabeママ 編集日時 2003-04-16 17:20 ]
七味唐辛子
ぬし
会議室デビュー日: 2001/12/25
投稿数: 660
投稿日時: 2003-04-15 16:31
javaではなくDBの話だと思いますが,私ならこうします。

rs = stmt.executeQuery("SELECT MAX(Doc_No) as maxno  FROM Doc_TB");
rs.next();

Get_No= rs.getInt("maxno");

で行けるのでは? 



raystar
ぬし
会議室デビュー日: 2003/01/16
投稿数: 251
お住まい・勤務地: Tokyo/Japan
投稿日時: 2003-04-15 19:27
グループ関数を使うのであれば、別名をつけたほうがよろしいです。
tabby
ベテラン
会議室デビュー日: 2002/06/26
投稿数: 55
お住まい・勤務地: 埼玉県・東京都
投稿日時: 2003-04-16 04:06
私の場合はもっぱらこれです。

rs.getInt(1);

後でわからなくならないように定数にしておくパターンが多いです。
final int MAXNO = 1;
rs.getInt(MAXNO);

こういうのって他の人がどうやってるか妙に気になる (^^;
nabeママ
常連さん
会議室デビュー日: 2003/04/11
投稿数: 39
投稿日時: 2003-04-16 09:12
おはようございます。
七味唐辛子さん、raystarさん、tabbyさんレスありがとうございます。
なるほど!!と思う自分ですが、勉強不足で恥ずかしい限りです。

MAX関数によって最大値は取得できました。
本当にありがとうございました。
人によっていろいろなやり方があるのですね。参考になります。
またよろしくお願いします。

[ メッセージ編集済み 編集者: nabeママ 編集日時 2003-04-16 17:24 ]
tommy
会議室デビュー日: 2003/03/11
投稿数: 15
投稿日時: 2003-04-17 02:03
引用:

rs.getInt(1);

後でわからなくならないように定数にしておくパターンが多いです。
final int MAXNO = 1;
rs.getInt(MAXNO);

こういうのって他の人がどうやってるか妙に気になる (^^;



このコーディングはハマる可能性があるような気がします。たとえば、

select * from hoge という SQL 文でクエリをおこない、
getInt(fieldNo) で値を取得しているケースで、
テーブル定義が変更になったとたん、あちこちで予期しない値を取得してしまう、

とか、

select A, B, C from hoge という SQL 文でクエリをおこない、
getINT(A) で値を取得しているケースで、
フィールド名の変更にあわせて定数の名称だけ修正してしまい、
SQL 文がエラーになる、

とか。

素直にフィールド名で getInt("A") としたほうがよいような...。
そういう苦労したことありませんか?
katsum
大ベテラン
会議室デビュー日: 2002/02/27
投稿数: 119
お住まい・勤務地: 東京都
投稿日時: 2003-04-18 01:58
私なら次のように書きます。

final String ALIAS_MAX_DOC_NO = "maxno";

String sql = "SELECT MAX(Doc_No) as " + ALIAS_MAX_DOC_NO + " FROM Doc_TB";
rs.next();
int maxDocNo = rs.getInt(ALIAS_MAX_DOC_NO);
まりり
ぬし
会議室デビュー日: 2001/12/05
投稿数: 329
投稿日時: 2003-04-18 11:03
> select * from hoge という SQL 文でクエリをおこない、

これは設計がまずいと思いますよ・・・
改修時におっしゃられる苦労を背負い込むだけでなく、
実行時にRDBMS側で毎度無駄な処理を走らせていることになります。

> 素直にフィールド名で getInt("A") としたほうがよいような...。
> そういう苦労したことありませんか?

苦労はしますけど、コーディング側だけで逃げれる話でもないと
思いますよ。
現状のテーブル定義や取得フィールドが変わるというのはかなりの
インパクトのはずなので、それなりの注意がいりますし。

パフォーマンスを考えたらgetInt(1)のほうが速いでしょうから、
これをstatic final intで定義した変数で読み替えるというのは
よくある手かなと思います。

ただ、レスポンスタイムにシビアな条件がつかないのなら私は
あんまり凝ったことはせずにgetInt("A")のようにしちゃいそうですが。

スキルアップ/キャリアアップ(JOB@IT)