みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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)でもレコードが抽出されることが理解できません。このようなことが起こり得るのでしょうか。

投稿日時 - 2006-11-24 11:02:15

QNo.2558990

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

7人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.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さんが答えてるようにイコールで結ぶと同じものになっている
ようなので・・・・

投稿日時 - 2006-11-27 09:58:31

お礼

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

投稿日時 - 2006-11-27 10:20:54

ANo.4

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

投稿日時 - 2006-11-24 16:36:55

お礼

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

投稿日時 - 2006-11-24 17:11:11

ANo.3

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

基本的に like でパターン文字なしはやめた方がよいと思います。

参考URL:http://otn.oracle.co.jp/forum/index.html

投稿日時 - 2006-11-24 13:32:10

お礼

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

投稿日時 - 2006-11-24 17:06:41

ANo.2

Oracle9.2(私の環境)では、発生します。

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

意図があってCHARにされていると思いますが、VARCHARに変更可能
であれば、それで対応できると思います。

投稿日時 - 2006-11-24 13:03:24

お礼

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

投稿日時 - 2006-11-24 17:03:28

ANo.1

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

投稿日時 - 2006-11-24 12:29:37

補足

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

投稿日時 - 2006-11-24 16:57:24

あなたにオススメの質問