LIKE演算子では正規表現ほどの強力な判定はできない。
postgresqlでは以下の演算子を用いることで、正規表現(POSIX正規表現)を使って判定を行うことが可能。
~
postgresqlのドキュメントに演算子について以下のパターンがあるとの記載あり。
https://www.postgresql.jp/document/9.5/html/functions-matching.html
使用例
使用例は以下の通り。
select s.id,--社員ID
s.name,--社員名
s.busyo,--部署コード
s.id ~ '^[A-C].*0001$'--A,B,Cのいずれかで始まり0001で終わる社員IDか判定
from syain s
idが'A0100001'、'C9910001'はTRUE、'a0100001'、'C9911001'、'D0100001'はFALSEの判定となる。
右辺にDB値を使用する
右辺にDB値を使用したい場合、以下のように指定する。
select s.id,--社員ID
s.name,--社員名
s.busyo,--部署コード
s.id ~ ('^' || s.busyo || '.*0001$')--部署コードで始まり0001で終わる社員IDか判定
from syain s
LIKE演算子とは異なり、右辺全体を()で閉じる必要がある。
()で閉じない場合、最初の結合子(||)の前までを右辺と判断するようだ。
以下の例では判定した結果の文字列表現を結合子以降の文字列と結合した形で取得される。
select s.id,--社員ID
s.name,--社員名
s.busyo,--部署コード(A01とする)
s.id ~ '^' || s.busyo || '.*0001$'--IDの最初が部署コードと同じ場合、'trueA01.*0001$'の文字列が取得される
from syain s
SIMILAR TO演算子
正規表現を使った判定に用いることができる演算子にSIMILAR TOがある。
この演算子はLIKE演算子と~演算子のハイブリッドのようなもので、LIKEのパターンマッチ、正規表現のパターンマッチを用いることができる。
個人的には、SIMILAR TO演算子はLIKEのパターンマッチが含まれているためあまり直感的に使用できないと感じたため、今回は~演算子のみの説明とし、SIMILAR TO演算子は紹介のみにとどめる。
使用する場面の制限
~演算子の使用については、postgresqlのドキュメントにセキュリティ上の問題を抱えているとの記載がある。
~演算子の左辺、右辺にプリペアードステートメントでアプリ使用者の任意の値を受け付ける場合、悪意のある攻撃を受けることがあるということ。
使用する際はこのような点に十分に気を付けることを心がける必要がある。