━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■■■■ PostgreSQL スキルアップノート
■■■■
■◆■■ パターンマッチ・その1(LIKE及びSIMILAR TO)
■■■■
■■■■
■■■■ 2013/01/04
■■■■ 使用環境:PostgreSQL9.1.4 (CentOS6.2)
(C) 2012 ohdb
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
★自己都合によりマニュアルへのリンクは9.2としています。ご了承下さい。
★このページはそのままカット&ペーストで実行して試すことができます。
【マニュアル】
パターンマッチ →●[マニュアル]
【参考記事】
−
【用語等】
PostgreSQLのパターンマッチは大別して3種類。(マニュアルより)
・LIKE演算子
・SIMILAR TO演算子
・POSIX正規表現
本ページではLIKEとSIMILAR TOを対象。
■1■ LIKE演算子
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1.LIKE演算子
──────────────────────────────
┌───┐
│ 省略 │
└───┘
2.ILIKE演算子
──────────────────────────────
ILIKEは大文字と小文字を区別しない。(PostgreSQL拡張)
SELECT 'postgresql' LIKE 'P%'; -- false
SELECT 'postgresql' ILIKE 'P%'; -- true
3.その他
──────────────────────────────
PostgreSQL固有の表記方法なのであえて使うメリットはないが
以下のような記述をすることも可能。
~~ および !~~ はLIKE およびNOT LIKEと同じ意味
~~* および !~~* はILIKEおよび NOT ILIKEと同じ意味
■2■ SIMILAR TO正規表現
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
SIMILAR TOは標準SQL(SQL:1999)の正規表現定義に沿ったもの。
1)正規表現を用いるという点では後述のPOSIX正規表現に近い。(ただし正規表現の記法は違う)
2)マッチの対象範囲が文字列全体に対してであるという点がPOSIX正規表現と異なりLIKEに似る。
3)%や_ がLIKEと同じように使える。
【補足】2)の例
SIMILAR TOの場合 SIMILAR TO '%aaaa%' -- %などで必ず全体を記述
POSIX正規表現の場合 ~ 'aaaa'; -- 関係のある部分のみを記述
LIKE,SIMILAR TO,POSIX正規表現の適用は人それぞれにならないように何らかの方針が必要?。
1.SIMILAR TOの「ワイルドカード文字」(%と_)
──────────────────────────────
SELECT 'postgresql' SIMILAR TO 'p%'; -- true
SELECT 'postgresql' SIMILAR TO 'P%'; -- false
SELECT 'postgresql' SIMILAR TO 'p_stgre_ql'; -- true
メタ文字の打ち消し(メタ文字を無効に)
SELECT 'p_stgre_ql' SIMILAR TO 'p\_stgre\_ql'; -- true
SELECT 'p_stgre_ql' SIMILAR TO 'p@_stgre@_ql' escape '@'; -- true
2.SIMILAR TOの「パターンマッチメタ文字」
──────────────────────────────
メタ文字 意味
---------------------------------------------------
| 二者択一
* 直前の項目の0回以上繰り返し
+ 直前の項目の1回以上繰り返し
? 直前の項目の0回もしくは1回の繰り返し
{m} 直前の項目のm回の繰り返し
{m,} 直前の項目のm回以上の繰り返し
{m,n} 直前の項目のm回以上 n回以下の繰り返し
丸括弧() 項目を1つの論理項目にグループ化
大括弧式[...] 文字クラス
SELECT 'postgresql' SIMILAR TO '%aaaa%|%gre%'; -- true
SELECT 'postgresql' SIMILAR TO '%(aaaa|gre)%'; -- true
SELECT 'abcd' SIMILAR TO '(a|b)%'; -- true
SELECT 'bcd' SIMILAR TO '(a|b)%'; -- true
SELECT 'abcd' SIMILAR TO '(a|b)___'; -- true
SELECT 'postgregresql' SIMILAR TO 'post(gre)*sql'; -- true
SELECT 'postgresql' SIMILAR TO 'post(gre)*sql'; -- true
SELECT 'postsql' SIMILAR TO 'post(gre)*sql'; -- true
SELECT 'postgregresql' SIMILAR TO 'post(gre)+sql'; -- true
SELECT 'postgresql' SIMILAR TO 'post(gre)+sql'; -- true
SELECT 'postsql' SIMILAR TO 'post(gre)+sql'; -- false
SELECT 'postgregresql' SIMILAR TO '%(gre)*%'; -- true
SELECT 'postgresql' SIMILAR TO '%(gre)*%'; -- true
SELECT 'postsql' SIMILAR TO '%(gre)*%'; -- true
SELECT 'postgregresql' SIMILAR TO '%(gre)+%'; -- true
SELECT 'postgresql' SIMILAR TO '%(gre)+%'; -- true
SELECT 'postsql' SIMILAR TO '%(gre)+%'; -- false
SELECT 'postgregresql' SIMILAR TO '%(gre)+%'; -- true
SELECT 'postgresql' SIMILAR TO '%(gre)+%'; -- true
SELECT 'postsql' SIMILAR TO '%(gre)+%'; -- false
SELECT 'postgregresql' SIMILAR TO '%(gre)?%'; -- false
SELECT 'postgresql' SIMILAR TO '%(gre)?%'; -- true
SELECT 'postsql' SIMILAR TO '%(gre)?%'; -- true
SELECT 'postgregresql' SIMILAR TO '%(gre){2}%'; -- true
SELECT 'postgresql' SIMILAR TO '%(gre){2}%'; -- false
SELECT 'postsql' SIMILAR TO '%(gre){2}%'; -- false
SELECT 'postgggsql' SIMILAR TO '%g*%'; -- true
SELECT 'postgsql' SIMILAR TO '%g*%'; -- true
SELECT 'postsql' SIMILAR TO '%g*%'; -- true
SELECT 'postgggsql' SIMILAR TO '%g+%'; -- true
SELECT 'postgsql' SIMILAR TO '%g+%'; -- true
SELECT 'postsql' SIMILAR TO '%g+%'; -- false
SELECT 'postgggsql' SIMILAR TO '%g{3}%'; -- true
SELECT 'postgggsql' SIMILAR TO '%g{2}%'; -- true
SELECT 'postgggsql' SIMILAR TO '%g{1}%'; -- true
SELECT 'postgsql' SIMILAR TO '%g{3}%'; -- false
SELECT 'postsql' SIMILAR TO '%g{3}%'; -- false
SELECT 'postgggsql' SIMILAR TO '%g{4,}%'; -- false
SELECT 'postgggsql' SIMILAR TO '%g{3,}%'; -- true
SELECT 'postgggsql' SIMILAR TO '%g{2,}%'; -- true
SELECT 'postgggsql' SIMILAR TO '[a-oq-z]%'; -- false
SELECT 'postgggsql' SIMILAR TO '[a-z]%'; -- true
SELECT 'postgggsql' SIMILAR TO '[abcd]%'; -- false
SELECT 'postgggsql' SIMILAR TO '[opqr]%'; -- true
【参考】SUBSTRING関数の中でも使用が可能
詳細はマニュアルの SIMILAR TO正規表現 の後半に記載あり。
以上