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

Naofumi Kondoh nkon @ shonan.ne.jp
2002年 6月 30日 (日) 10:40:34 JST


ソフト工房の近藤です。こんにちは。

Satoshi Nagayasu wrote:
> 永安です。
>
> Naofumi Kondoh wrote:

-- snip --

>>アンダースコアやパーセント記号そのものをパターンマッチさせたい場合は
>>patternの文字1字づつエスケープ文字で指定する必要があります。ディフォルトの
>>エスケープ文字はバックスラッシュですが、ESCAPE句を使用することによって変更
>>が可能です。エスケープ文字そのものとのマッチさせたい場合は、エスケープ文字
>>を2つ記述して下さい。
>
>
> 「パーセント記号をマッチングさせるにはエスケープ文字が必要」
> 「エスケープ文字にマッチングさせるにはエスケープ文字をふたつ続ける」
>
> ことは書いてありますが、「パーセント記号にマッチさせるエスケープ文字」が、
> 「エスケープ文字そのもの」なのか「エスケープされたエスケープ文字」なのかは
> 上の説明からは判然としません。

なるほど。 ¥ をエスケープ文字として使う場合の
説明と例題が不足ということですね。

ESCAPE 句に指定された文字ととると意味はすっきりするの
ですが、「変更可能です」とあるから、 ’¥’もエスケープ
文字として捉えると、意味がおかしくなりますね。
本来の意味は、% が先頭にあるという意味で、 '#' を下記の
ように使う場合

pgbash> select * from td where bb like '#%%' escape '#';
 aa | bb
----+-------------
  1 | %ではじまる
  9 | %と#の両方

エスケープ文字自身をパターンに含めるならば「ふたつ続ける」
といういみですね。'\' エスケープ文字でなければ、わかりや
すい文章なんだけど、'\'が特殊な扱いなので、たしかに混乱
するかもしれませんね。

pgbash> select * from td where bb like '#%%##%' escape '#';
 aa | bb
----+------------
  9 | %と#の両方


> 後者の「エスケープ文字を二つ続ける」という表現からすると、
> 前者の「エスケープ文字」というのは「エスケープ文字ひとつ」と
> 解釈される可能性もあります。
> 多分、初めて読んだらそう解釈する人が多いのではないかと思います。
>
> でも実際には「エスケープされたエスケープ文字」が必要なわけですよね?

それは、'\' の場合だけの特例です。
上の例のように、ESCAPE 句に指定した '\' 以外の文字
なら、単純に2つ続けるだけでその文字自身になります。

# このあたりは、 SQLの規格の母胎の影響でしょうね。
# % _ とか、 クォートされた文字列中のクォートを
# 2つ続けてあらわすとか。"Hello ""WORLD"" ! "
# SQLができたころのキーボードには、'\' はなかったような。

>
> なので、
>
>
>>'%abc' LIKE '\\%%'      true

私は、 LIKE 述語では、ESCAPE 句を使って、なるべく
パターン中にない任意の文字( \ 以外)を使って書くも
のだと思っています。その方が無理して \ を使うより
簡単です。

'\'がエスケープ文字というのは、PostgreSQL 独自の
規格でしょうか?。他のDBはどうですかね。
私は、 LIKE .... ESCAPE ... しか使ったことがない
もので。 ≫ 詳しい方。

_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
 (株)ソフト工房   近藤直文        Email:  nkon @ shonan.ne.jp
http://www.SOFTKOUBOU.co.jp/      http://www.shonan.ne.jp/~nkon/
2002-07-27(土)14:00-16;30 JPUG 業務アプリ分科会 セミナー/勉強会
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/






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