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