エスケープ文字を正規表現でマッチさせる

LIKE文でのエスケープ処理

正規表現の中で一番使うんじゃないかなあと思う。以下、「#」がエスケープ文字指定。
  test_\(testは任意文字)というユーザがいたとしてそれにマッチさせたい場合。この「\」(エンマーク)がクセモノ。

SELECT * FROM user_table WHERE user_name LIKE '%#_\\' ESCAPE '#';

というようにいくらESCAPE文字を指定しても「\」は特殊文字として扱われる。
  で、ESCAPE句を使わないとすると以下のようになる。

SELECT * FROM user_table WHERE user_name LIKE '%\\_\\\\';

もう、めっちゃ違和感あるけど「\\\\」(エンマーク4つ)で「\」(エンマーク一つ)にマッチする。
  PostgreSQL8.3.0のドキュメントによると、

アンダースコアやパーセント記号というリテラルを他の文字のマッチに使用するのではなく、そのものにマッチさせたい場合には、
patternの中のそれぞれのアンダースコアとパーセント記号の前にエスケープ文字を付けなければなりません。
デフォルトのエスケープ文字はバックスラッシュですが、ESCAPE句で他の文字を指定することができます。
エスケープ文字そのものをマッチさせるにはエスケープ文字を2つ書きます。

「\」(エンマーク)については以下のように書いてあります。

リテラル文字列においてバックスラッシュには始めから特別な意味合いがあるので、バックスラッシュを含んだパターン定数を記述する時は
問い合わせの中で2つのバックスラッシュを記述する必要があることに注意してください(エスケープ文字列構文の使用を前提)。
したがって、実際にバックスラッシュそのものにマッチするパターンを記述するには、文の中でバックスラッシュを4つ記述する必要があります。
ESCAPE句で他のエスケープ文字を選択すればこのような状況を回避でき、バックスラッシュはLIKE式にとって特殊な文字ではなくなります
(とは言っても、リテラル文字列パーサにとっては依然として特殊文字なので、やはり2つは必要です)。

と書いてある。笑
  んな文章でわかるか、コノヤロー!!
  で実際はどうなっているかというと、以下のPostgreSQLメーリングリストが非常に役に立った。
  http://ml.postgresql.jp/pipermail/pgsql-jp/2002-June/010097.html
  要するに「\」(エンマーク)は超特殊文字で「\」(エンマーク1つ)を文字列として表示させるには、「\\」(エンマーク2つ)が必要となる。
  で、つまりは

「\\」つまりは普段のエスケープ文字としての「\」、「\」は「\\」で初めて一つの文字列「\」のようです。
「\\\\」普段のエスケープ文字である「\」(「\\」)をエスケープするために、「\」(「\\」)をつけたもの。
ESCAPE文字として「#」を指定した場合は、文字列「#」にマッチさせたい場合は「##」。

という感じらしい。
  ちなみに「\_%test#」(testは任意文字)という文字列にマッチする正規表現とかかなりカオス。。。

SELECT * FROM user_table WHERE user_name LIKE '\\#_#%%##' ESCAPE '#';

ESCAPE句を使わないと悲惨なことになる。

SELECT * FROM user_table WHERE user_name LIKE '\\\\\\_\\%%#';

笑。なんてこったい。みなさんできるだけESCAPE句を使って「\」(エンマーク)を使わないで済むようにしましょう。笑