SIMILAR TO
SIMILAR TO 运算符使用 SQL 标准正则表达式模式来匹配字符串表达式(如列名称)。SQL 正则表达式可包含一组模式匹配元字符,包括 LIKE 运算符支持的两个元字符。
仅当模式与整个字符串匹配时,SIMILAR TO 运算符才会返回 true,这与 POSIX 正则表达式的行为不同(其中的模式可与字符串的任何部分匹配)。
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
-
有效的 UTF-8 字符表达式,表示 SQL 标准正则表达式模式。
- escape_char
-
将对模式中的元字符进行转义的字符表达式。默认为两个反斜杠 ('\\')。
如果 pattern 不包含元字符,则模式仅表示字符串本身。
其中一个字符表达式可以是 CHAR 或 VARCHAR 数据类型。如果它们不同,Amazon Redshift 会将 pattern 转换为 expression 的数据类型。
SIMILAR TO 支持下列模式匹配元字符:
操作符 | 描述 |
---|---|
% |
匹配任意序列的零个或多个字符。 |
_ |
匹配任何单个字符。 |
| |
表示替换(两个替换中的一个)。 |
* |
重复上一项目零次或更多次。 |
+ |
重复上一项目一次或更多次。 |
? |
重复上一项目零次或一次。 |
{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