• 締切済み

LIKEを使用したレコード抽出について

OracleでLIKEを使用したレコード抽出で困っています。 あるテーブル(TAB_A)が以下のような属性だとします。 ------------- COL1 CHAR(5) COL2 CHAR(5) このとき、このテーブルに次のようにデータが格納されています。 COL1  COL2 -------------- ABC==  12345 [=]は便宜上1バイトスペースを表す このテーブルを対象として (1) SELECT * FROM TAB_A WHERE COL1 LIKE 'ABC%'; (2) SELECT * FROM TAB_A WHERE COL1 LIKE 'ABC==';   ([=]は便宜上1バイトスペースを表す) (3) SELECT * FROM TAB_A WHERE COL1 LIKE 'ABC'; というSQLを発行した場合に、いずれもレコードが抽出されてしまいます。(1)(2)の場合は当然だとは思うのですが、(3)でもレコードが抽出されることが理解できません。このようなことが起こり得るのでしょうか。

みんなの回答

回答No.5

#2です。 私の環境の補足です。 パッチは最新は適用しておりませんので、9.2.0.1.0になっております。 試した内容は、以下です。 SQL> create table test (col1 char(5),col2 char(5) 表が作成されました。 SQL> insert into test values ('ABC==','123--'); SQL> insert into test values ('ABC','123'); SQL> insert into test values ('ABC=','123-'); SQL> select * from test; COL1 COL2 ----- ----- ABC 123-- ABC 123 ABC 123- SQL> select * from test where col1 like 'ABC'; COL1 COL2 ----- ----- ABC 123-- ABC 123 ABC 123- SQL> select * from test where col1 like 'ABC%'; COL1 COL2 ----- ----- ABC 123-- ABC 123 ABC 123- SQL> select * from test where col1 like 'ABC %'; COL1 COL2 ----- ----- ABC 123-- ABC 123 ABC 123- パッチを適用すれば直るのですかね。。仕様だと思っていました。 #4さんが答えてるようにイコールで結ぶと同じものになっている ようなので・・・・

yanchiko
質問者

お礼

回答ありがとうございます。 私の環境も9.2.0.1.0です。 やはり最新のパッチを適用しなくてはいけないのでしょうね…

すると、全ての回答が全文表示されます。
回答No.4

#1です。 ちょっと補足です。 naochancomさんのおっしゃるように LIKEではなく、=なら col1='ABC=='もcol1='ABC'も選択されます。 #結局はMZ-80Bさんのおっしゃるように >基本的に like でパターン文字なしはやめた方がよいと思います。 だと思います(^^;

yanchiko
質問者

お礼

回答ありがとうございます。 >基本的に like でパターン文字なしはやめた方がよいと思います。 皆様のご意見を参考に、パターン文字を使用するようにしたいと思います。

すると、全ての回答が全文表示されます。
  • MZ-80B
  • ベストアンサー率56% (46/81)
回答No.3

like は以下の引用のように空白埋め比較セマンティクスと異なる 動作になりますから、その動きはおかしいですね。 ---- SQL リファレンスマニュアル パターンに文字「%」が含まれていない場合、 両方のオペランドの長さが同じ場合にのみ、 条件がTRUE(真)になります。 ---- つまり、サポート行き&パッチ情報=アンタッチャブルな感じがします。 OTNで過去ログを探して、みつからなければ質問してみてはどうですか? 基本的に like でパターン文字なしはやめた方がよいと思います。

参考URL:
http://otn.oracle.co.jp/forum/index.html
yanchiko
質問者

お礼

回答ありがとうございます。 これからOTNで調べてみます。

すると、全ての回答が全文表示されます。
回答No.2

Oracle9.2(私の環境)では、発生します。 ColumnにCHARを指定しているのでそのような現象 になっていると思います。 CHARは固定長でデータを保持するため(後ろにスペースがつきます) 後ろスペースを無視します。 よって、 COL1='ABC' とCOL1='ABC='は同じ値になります。 (Primary keyなど張っていれば、一意制約違反になるはずです) データタイプがVARCHARであれば、問題なく検索できると思います。 意図があってCHARにされていると思いますが、VARCHARに変更可能 であれば、それで対応できると思います。

yanchiko
質問者

お礼

回答ありがとうございます。 訳あってVARCHARには変えられないのが残念です。 naochancomさんの環境はOracle9.2ということですが、最新のパッチを当てている中で発生しているということでしょうか。

すると、全ての回答が全文表示されます。
回答No.1

こちらの環境(10.2と9.2)では(3)は抽出されませんでした。 どういった環境で実行しましたか? DBのバージョンは何でしょうか? 最新のパッチなどを当ててみてはどうでしょうか? (要サポート契約)

yanchiko
質問者

補足

回答ありがとうございます。 なお、試したバージョンは、ossan_hiroさんと同じ10.2と9.2です。 最新のパッチを当てているかどうかは「?」です。管理者に聞いてみます。

すると、全ての回答が全文表示されます。

関連するQ&A