- - PR -
prepareStatementについて
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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がなくとも検索結果が得られます。 なぜなのでしょうか? | ||||
|
投稿日時: 2007-02-21 18:08
あるカラムにインデックスが張られていても、RTRIM(BID)のように関数でその値を変更してしまうような場合にはインデックスは使用できません。
インデックスで検索したいなら、関数インデックスを作成するか、そのカラムに対して関数を使わない方法で検索する必要があります。 たとえば、
のようにすればよいと思います。 | ||||
|
投稿日時: 2007-02-21 20:41
データ型がCHAR(5)なら、
SELECT COUNT(*) FROM KPF040 WHERE BID = 'AAA ' として検索すればいいのではないですか? やってることはsawatさんと基本的に同じ ですが、プログラム側で処理できればこれでかまわないと思います。 ところで、PreparedStatementを使っているとのことですが、プレースホルダは 使用していないのですか? | ||||
|
投稿日時: 2007-02-22 15:48
お二人ともありがとうございました。
解決しました。 'AAA ' の部分は実際にはString変数に格納されていて、PreparedStatementを使用して、SQL分の「SELECT COUNT(*) FROM KPF040 WHERE BID = ?」の?の部分を置換しているのですが、その際に、Java→JDBCでString型はVARCHAR型に変換されるらしく、そのため BID(CHAR型)とVARCHAR型の比較になるために後ろスペースも含めて一致していないといけなくなるのでした。 |
1