[pgsql-jp: 26547] Re: % で始まる文字の LIKE 検索
Hajime Lucky Okada
luckyo @ tpk.toppan.co.jp
2002年 6月 30日 (日) 15:51:32 JST
岡田です。 みなさまありがとうございます。
昨日はへろへろで返事が遅くなり申し訳ありませんでした。
結果論として LIKE 検索パターンの中で '%' 文字自身を表すためには、
「エスケープ文字をエスケープさせなければならない」ということでした。
私もあのドキュメントを読んで上記の内容は想像出来なかった一人として、
事実を知った時は瞳孔が開き 道でこけかけましたが、ある意味 目から鱗で
感動でした♪ 一番最初にコメントを下さった三村さんが実は近かったんですね。
失礼致しました。
昨日のサンプルに文字列の中に '%' の存在する4件目のデータ 'te%st' を
追加し、、、
mountdb=# select * from aaa;
id | content
----+----------
1 | ぽよよん
2 | %test
3 | どかーん
4 | te%st
(4 rows)
mountdb=# -- (頭 % の文字列 検索)
mountdb=# select * from aaa where content like '\\%%';
id | content
----+---------
2 | %test
(1 row)
mountdb=# -- (% を含む文字列 検索)
mountdb=# select * from aaa where content like '%\\%%';
id | content
----+---------
2 | %test
4 | te%st
(2 rows)
確かに、想定通りの結果を確認出来ました。
(文字の中/語尾にだけ '%' 文字の検索には、やはり正規表現だけが
可能なんでしょぅね)
折角なので、本家のドキュメントを引っ張ってみました。
http://www.postgresql.org/idocs/index.php?functions-matching.html
「 To match a literal underscore or percent sign without matching other characters,
the respective character in pattern must be preceded by the escape character.
The default escape character is the backslash but a different one may be selected
by using the ESCAPE clause. To match the escape character itself, write two escape
characters. 」
私の能力では、このまま読めばあの和訳そのものになりますね。
% をエスケープするには、\ の一文字で十分と読め、まさか この \ までもエスケープ
しなければならないと訳すのは、やはり超訳の部類に入るといっても仕方ないと考えます。
最後に少し気になる点は、この記述は Postgres では有効としても、
他のDBへの互換性はどうなんでしょうね。
ありがとうございました。
岡田はじめ
pgsql-jp メーリングリストの案内