[pgsql-jp: 26535] % で始まる文字の LIKE 検索

Hajime Lucky Okada paraiso @ luckyo.8m.com
2002年 6月 29日 (土) 17:08:20 JST


岡田と申します。 お世話になっております。

さて、半角 % で始まる(を含んだ)テキストの LIKE 検索で、
私の理解が間違っているのか期待している結果を返してくれません。
ご教授頂けますでしょうか。

以下、サンプル・テストを示します。

mountdb=# create table aaa (id int, content text);
CREATE
mountdb=# insert into aaa values ('1', 'ぽよよん');
INSERT 158202 1
mountdb=# insert into aaa values ('2', '%test');
INSERT 158203 1
mountdb=# insert into aaa values ('3', 'どかーん');
INSERT 158204 1
mountdb=#
mountdb=#
mountdb=# select * from aaa;
 id | content
----+----------
  1 | ぽよよん
  2 | %test
  3 | どかーん
(3 rows)

3件ほどテストデータを入れます。  
この中で、content 文字列が '%' で始まるレコードを検索したいとします。
'%' の後ろの文字列は記憶にありません。  

そこで、、、「4.5.1. LIKE述語を使用したパターンマッチング」
http://osb.sra.co.jp/PostgreSQL/Manual/PostgreSQL-7.1-ja/functions-matching.html
に基づき、「アンダースコアやパーセント記号そのものをパターンマッチさせたい場合は
patternの文字1字づつエスケープ文字で 指定する必要があります。」ということで、
'%' 自身を表すため \ でエスケープさせ '\%'、不定文字列を表すため '%' を付加して
検索してみます。

mountdb=# select * from aaa where content like '\%%';
 id | content
----+----------
  1 | ぽよよん
  2 | %test
  3 | どかーん
(3 rows)

するとこの様に全部選択されてしまいます。試しの '%%%' も、同じ結果。

おっと偶然、% の次の文字 t を思い出したとして、

mountdb=# select * from aaa where content like '\%t%';
 id | content
----+---------
  2 | %test
(1 row)

とすれば、期待値が出てきました。



ちなみに、正規表現 '^%' を使えば、

mountdb=# select * from aaa where content ~ '^%';
 id | content
----+---------
  2 | %test
(1 row)

と、期待値が返ってきます。


他との兼ね合いで LIKE 表現を使いたいのですが、
先頭文字% だけの記憶で LIKE 検索は出来ないのでしょぅか?


環境:
Postgres 7.2.1
Solaris 2.5

以上、宜しくお願い致します。

岡田はじめ













pgsql-jp メーリングリストの案内