- PR -

prepareStatementについて

1
投稿者投稿内容
りりー
常連さん
会議室デビュー日: 2006/08/03
投稿数: 31
投稿日時: 2007-02-21 17:10
ORACLE10gを使用してあるテーブルのあるカラム『BID』の型がCHAR(5)という固定長のテーブル仕様という状況で、実際に入るデータは可変長だったとします。

INSERTされたデータをJavaコーディング、JDBCのprepareStatementを使用して
SELECT COUNT(*) FROM KPF040 WHERE RTRIM(BID) = 'AAA'
と実行する場合、INDEXが使用されません
しかし、RTRIMをはずすと、検索結果が0件になってしまいます。

SQLエディタなどのツールでSQLを実行する場合にはRTRIMがなくとも検索結果が得られます。

なぜなのでしょうか?
sawat
大ベテラン
会議室デビュー日: 2006/08/02
投稿数: 112
投稿日時: 2007-02-21 18:08
あるカラムにインデックスが張られていても、RTRIM(BID)のように関数でその値を変更してしまうような場合にはインデックスは使用できません。
インデックスで検索したいなら、関数インデックスを作成するか、そのカラムに対して関数を使わない方法で検索する必要があります。

たとえば、
コード:
SELECT COUNT(*) FROM KPF040 WHERE BID = RPAD('AAA', 5, ' ')


のようにすればよいと思います。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2007-02-21 20:41
データ型がCHAR(5)なら、

SELECT COUNT(*) FROM KPF040 WHERE BID = 'AAA '

として検索すればいいのではないですか? やってることはsawatさんと基本的に同じ
ですが、プログラム側で処理できればこれでかまわないと思います。

ところで、PreparedStatementを使っているとのことですが、プレースホルダは
使用していないのですか?
りりー
常連さん
会議室デビュー日: 2006/08/03
投稿数: 31
投稿日時: 2007-02-22 15:48
お二人ともありがとうございました。
解決しました。
'AAA ' の部分は実際にはString変数に格納されていて、PreparedStatementを使用して、SQL分の「SELECT COUNT(*) FROM KPF040 WHERE BID = ?」の?の部分を置換しているのですが、その際に、Java→JDBCでString型はVARCHAR型に変換されるらしく、そのため
BID(CHAR型)とVARCHAR型の比較になるために後ろスペースも含めて一致していないといけなくなるのでした。

1

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