AnalyticDB for PostgreSQL は、PostgreSQL から継承された以下の 3 種類のパターンマッチング機能をサポートしています:`LIKE` 演算子、`SIMILAR TO` 演算子、および POSIX 正規表現です。PostgreSQL の完全な仕様については、「パターンマッチング」をご参照ください。
LIKE 演算子
`LIKE` 演算子は、ワイルドカード文字を使用して文字列とパターンを照合します。
構文
SELECT column1, column2, ...
FROM table
WHERE column LIKE pattern;パラメーター
| パラメーター | 説明 |
|---|---|
column | パターンと照合する値を持つ列 |
pattern | 照合対象のパターン。ワイルドカード文字を含めることができます |
ワイルドカード文字
| ワイルドカード | 対応する内容 |
|---|---|
% | ゼロ個以上の任意の文字 |
_ | 任意の 1 文字 |
例
| パターン | 説明 |
|---|---|
column LIKE 'abc%' | abc |
column LIKE '%xyz%' | xyz |
column LIKE '_bc_' | 4 文字の値で、2 文字目と 3 文字目がそれぞれ b および c であるもの |
column LIKE 'a_b_c_' | 6 文字の値で、1 文字目、3 文字目、5 文字目がそれぞれ a、b、c であるもの |
column LIKE 'a%b' | a で始まり、b |
SIMILAR TO 演算子
`SIMILAR TO` 演算子は、正規表現のメタ文字を `LIKE` に拡張したものです。この演算子では、パターンが文字列全体と一致する必要があります。
構文
SELECT column1, column2, ...
FROM table
WHERE column SIMILAR TO pattern;パラメーター
| パラメーター | 説明 |
|---|---|
column | パターンと照合する値を持つ列 |
pattern | 照合対象の正規表現パターン |
サポートされるメタ文字
`SIMILAR TO` は、標準の正規表現メタ文字(.、*、+、?、|、(、))をすべてサポートしています。
例
-- 列の値に 1 個以上の数字が含まれる行を照合
SELECT * FROM table WHERE column SIMILAR TO '[0-9]+';[0-9]— 0 ~ 9 のいずれかの数字に一致+— 直前の要素が 1 回以上出現することを要求
POSIX 正規表現
POSIX 正規表現は POSIX 標準に準拠しており、完全な正規表現構文をサポートしています。regexp_replace() 関数および regexp_match() 関数と併用することで、部分文字列の変換や抽出が可能です。
regexp_replace()
regexp_replace() 関数は、POSIX 正規表現に一致する部分文字列を新しいテキストに置き換えます。
構文
regexp_replace(string text, pattern text, replacement text [, flags text])パラメーター
| パラメーター | 説明 |
|---|---|
string | 照合対象の元の文字列 |
pattern | 正規表現パターン |
replacement | 各一致箇所に代入する文字列 |
flags | 照合動作を制御するオプションのフラグ(例:グローバル置換のための g) |
例
すべての大文字を対応する小文字に置き換えます:
サンプルクエリ
SELECT regexp_replace('Hello, world!', '[A-Z]', lower('\1'), 'g');返却結果
hello, world!regexp_match()
regexp_match() は、正規表現に一致する部分文字列を抽出します。この関数は、パターン内の各キャプチャグループに対応する部分文字列の配列を返します。一致するものがない場合は、空の文字列を返します。
構文
regexp_match(expression text, pattern text [, flags text])パラメーター
| パラメーター | 説明 |
|---|---|
expression | 照合対象の文字列 |
pattern | 正規表現パターン |
flags | パターンの解釈方法を制御するオプションのフラグ |
例
フルネームを格納する name 列から名(ファーストネーム)を抽出します:
入力データ:
| name |
|---|
| John Smith |
| 山田花子 |
サンプルクエリ
SELECT regexp_match(name, '^(.*?)[ ](.*?)$') AS first_name
FROM names;結果
| 名 |
|---|
| {太郎} |
| {花子} |
パターン ^(.*?)[ ](.*?)$ は、最初の空白文字で分割されます。最初のキャプチャグループ (.*?) は名(ファーストネーム)に一致し、regexp_match() 関数はそれを配列の最初の要素として返します。