SIMILAR TO - Amazon Redshift

SIMILAR TO

SIMILAR TO 演算子は、列名などの文字列式を、SQL の標準的な正規表現パターンと突き合わせます。SQL の正規表現パターンには、LIKE 演算子によってサポートされる 2 つを含む、一連のパターンマッチングメタ文字を含めることができます。

SIMILAR TO 演算子の場合は、POSIX の正規表現の動作 (パターンは文字列の任意の部分と一致できる) とは異なり、パターンが文字全体と一致した場合にのみ true を返します。

SIMILAR TO は大文字小文字を区別するマッチングを実行します。

注記

SIMILAR TO を使用する正規表現マッチングは、計算コストが高くなります。非常に多くの行を処理する場合は特に、可能な限り、LIKE を使用することをお勧めします。例えば、以下に示す各クエリは機能的には同じですが、LIKE を使用したクエリは、正規表現を使用したクエリよりも数倍速く実行できます。

select count(*) from event where eventname SIMILAR TO '%(Ring|Die)%'; select count(*) from event where eventname LIKE '%Ring%' OR eventname LIKE '%Die%';

構文

expression [ NOT ] SIMILAR TO pattern [ ESCAPE 'escape_char' ]

引数

expression

列名など、有効な UTF-8 文字式。

SIMILAR TO

SIMILAR TO は、expression 内の文字列全体について、大文字小文字を区別するパターンマッチングを実行します。

pattern

SQL の標準的な正規表現パターンを表現する有効な UTF-8 文字式。

escape_char

パターン内でメタ文字をエスケープする文字式。デフォルトは 2 個のバックスラッシュ (「\\」) です。

pattern にメタ文字が含まれていない場合、pattern は文字列そのものを表現するにすぎません。

どちらの文字式も CHAR または VARCHAR のデータ型になることができます。文字式の型が異なる場合、Amazon Redshift は pattern のデータ型を expression のデータ型に変換します。

SIMILAR TO では、次のパターンマッチングメタ文字をサポートしています。

演算子 説明
% ゼロ個以上の任意の文字シーケンスをマッチングします。
_ 任意の 1 文字をマッチングします。
| 交替を示します (2 つの選択肢のいずれか)。
* 前の項目をゼロ回以上繰り返します。
+ 前の項目を 1 回以上繰り返します。
? 前の項目をゼロ回または 1 回繰り返します。
{m} 前の項目をちょうど m 回だけ繰り返します。
{m,} 前の項目を m 回またはそれ以上の回数繰り返します。
{m,n} 前の項目を少なくとも m 回、多くても n 回繰り返します。
() グループ項目を括弧で囲んで、単一の論理項目にします。
[...] 角括弧式は、POSIX 正規表現の場合のように、文字クラスを指定します。

次の表に、SIMILAR TO を使用したパターンマッチングの例を示します。

戻り値
'abc' SIMILAR TO 'abc' True
'abc' SIMILAR TO '_b_' True
'abc' SIMILAR TO '_A_' False
'abc' SIMILAR TO '%(b|d)%' True
'abc' SIMILAR TO '(b|c)%' False
'AbcAbcdefgefg12efgefg12' SIMILAR TO '((Ab)?c)+d((efg)+(12))+' True
'aaaaaab11111xy' SIMILAR TO 'a{6}_ [0-9]{5}(x|y){2}' True
'$0.87' SIMILAR TO '$[0-9]+(.[0-9][0-9])?' True

次の例では、名前に「E」または「H」が含まれる市を見つけます。

SELECT DISTINCT city FROM users WHERE city SIMILAR TO '%E%|%H%' ORDER BY city LIMIT 5; city ----------------- Agoura Hills Auburn Hills Benton Harbor Beverly Hills Chicago Heights

次の例では、デフォルトのエスケープ文字列 ('\\') を使用して「_」を含む文字列を検索します。

SELECT tablename, "column" FROM pg_table_def WHERE "column" SIMILAR TO '%start\\_%' ORDER BY tablename, "column" LIMIT 5; tablename | column --------------------------+--------------------- stcs_abort_idle | idle_start_time stcs_abort_idle | txn_start_time stcs_analyze_compression | start_time stcs_auto_worker_levels | start_level stcs_auto_worker_levels | start_wlm_occupancy

次の例では、エスケープ文字列として '^' を指定し、エスケープ文字列を使用して「_」を含む文字列を検索します。

SELECT tablename, "column" FROM pg_table_def WHERE "column" SIMILAR TO '%start^_%' ESCAPE '^' ORDER BY tablename, "column" LIMIT 5; tablename | column --------------------------+--------------------- stcs_abort_idle | idle_start_time stcs_abort_idle | txn_start_time stcs_analyze_compression | start_time stcs_auto_worker_levels | start_level stcs_auto_worker_levels | start_wlm_occupancy