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件)
- 最新から表示
- 回答順に表示
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さんが答えてるようにイコールで結ぶと同じものになっている
ようなので・・・・
No.3
- 回答日時:
like は以下の引用のように空白埋め比較セマンティクスと異なる
動作になりますから、その動きはおかしいですね。
---- SQL リファレンスマニュアル
パターンに文字「%」が含まれていない場合、
両方のオペランドの長さが同じ場合にのみ、
条件がTRUE(真)になります。
----
つまり、サポート行き&パッチ情報=アンタッチャブルな感じがします。
OTNで過去ログを探して、みつからなければ質問してみてはどうですか?
基本的に like でパターン文字なしはやめた方がよいと思います。
参考URL:http://otn.oracle.co.jp/forum/index.html
No.2
- 回答日時:
Oracle9.2(私の環境)では、発生します。
ColumnにCHARを指定しているのでそのような現象
になっていると思います。
CHARは固定長でデータを保持するため(後ろにスペースがつきます)
後ろスペースを無視します。
よって、
COL1='ABC' とCOL1='ABC='は同じ値になります。
(Primary keyなど張っていれば、一意制約違反になるはずです)
データタイプがVARCHARであれば、問題なく検索できると思います。
意図があってCHARにされていると思いますが、VARCHARに変更可能
であれば、それで対応できると思います。
回答ありがとうございます。
訳あってVARCHARには変えられないのが残念です。
naochancomさんの環境はOracle9.2ということですが、最新のパッチを当てている中で発生しているということでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) アクセス where句を使用して複数条件抽出をするには 2 2022/08/29 13:24
- Oracle SQLについて教えて下さい。 主キーを持ったカラムを主キーの機能を持たせたまま カンマ区切りで文字列 1 2023/03/27 22:47
- Oracle 下記のsqlで取得されるレコード以外を取得する方法ありますでしょうか。 SELECT B.番号, B 2 2022/04/20 23:21
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
- PostgreSQL PostgreSQL レコードからアイテム種類数を取得したい 2 2022/11/23 22:31
- Oracle 質問です。 下記のテーブルとデータがあり、 取得想定結果のように出力したいです。 下記のsqlだと0 2 2023/05/23 19:10
- MySQL 共通点はあります。何が違うのでしょうか? 1 2023/01/27 05:22
- MySQL 複数DBテーブルからのデータ取得 3 2022/05/17 15:02
- MySQL テーブル名が可変の場合のクエリの書き方 1 2023/02/17 21:21
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ORMについて
-
AccessのSQL文で1件のみヒット...
-
SELECT FOR UPDATE で該当レコ...
-
MERGE文について
-
オラクルのレコードカウントの制御
-
デフォルトでデータが表示され...
-
引数によってwhere句を切り替え...
-
SQLです教えてくださいお願いし...
-
select文の実行結果に空白行を...
-
テーブルの最後(最新)のレコー...
-
Excelの並び替え(文字数と画数...
-
ファイルの漢数字の順番につい...
-
SQLです。下記の問合せを行うク...
-
日付検索で0001-01-01 00:00:00...
-
DISTINCTROWについてです。
-
MySQLのdatetime型に0月0日を格納
-
SQLで曜日のソートを月火水木金...
-
NULLの挿入の仕方が…?
-
SQLです下記の問合せを行うクエ...
-
ORDER BY の項目を SELECT する...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
単一グループのグループ関数で...
-
【PL/SQL】FROM区に変数を使う方法
-
SELECT FOR UPDATE で該当レコ...
-
AccessのSQL文で1件のみヒット...
-
where句中のtrim関数について
-
アクセスのレポートでレコード...
-
group byの並び順を変えるだけ...
-
引数によってwhere句を切り替え...
-
SQL*Loader Append
-
SQLで条件にヒットしたレコード...
-
updateで複数行更新したい
-
データ
-
トランザクションログを出力せ...
-
「数字で始まらない」ものを抽...
-
大量レコードをTRUNCATEせずに...
-
osqleditについて
-
BLOB型項目をSQLの検索条件に指...
-
これをSQL文で出来るでしょうか?
-
ACCESS レコードの並び順について
-
【SQL】違うフィールド同士の集...
おすすめ情報