プロが教える店舗&オフィスのセキュリティ対策術

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

A 回答 (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さんが答えてるようにイコールで結ぶと同じものになっている
ようなので・・・・
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/11/27 10:20

#1です。


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

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

お礼日時:2006/11/24 17:11

like は以下の引用のように空白埋め比較セマンティクスと異なる


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

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

参考URL:http://otn.oracle.co.jp/forum/index.html
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/11/24 17:06

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



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

意図があってCHARにされていると思いますが、VARCHARに変更可能
であれば、それで対応できると思います。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/11/24 17:03

こちらの環境(10.2と9.2)では(3)は抽出されませんでした。


どういった環境で実行しましたか?
DBのバージョンは何でしょうか?
最新のパッチなどを当ててみてはどうでしょうか?
(要サポート契約)

この回答への補足

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

補足日時:2006/11/24 16:57
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!