SIMILAR TO - Amazon Redshift

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