POSIX 运算符 - Amazon Redshift

POSIX 运算符

POSIX 正则表达式是指定匹配模式的字符序列。如果字符串是正则表达式描述的正则集的成员,则该字符串与正则表达式匹配。

LIKESIMILAR TO 运算符相比,POSIX 正则表达式提供了更强大的模式匹配手段。POSIX 正则表达式模式可匹配字符串的任何部分,这与 SIMILAR TO 运算符不同,SIMILAR TO 运算符仅当其模式匹配整个字符串时才返回 true。

注意

使用 POSIX 运算符的正则表达式匹配的计算成本高昂。我们建议尽可能使用 LIKE,尤其是在处理非常多的行时。例如,下列查询的功能相同,但使用 LIKE 的查询相比于使用正则表达式的查询的运行速度快若干倍:

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

语法

expression [ ! ] ~ pattern

参数

expression

有效的 UTF-8 字符表达式(如列名称)。

!

求反运算符。请不要与正则表达式匹配。

~

expression 的任何子字符串执行区分大小写的匹配。

注意

~~LIKE 的同义词。

pattern

表示正则表达式模式的字符串文本。

如果 pattern 不包含通配符,则模式仅表示字符串本身。

要搜索包含元字符的字符串(如“. * | ? ”等),请使用两个反斜杠(“ \\”)对字符进行转义。与 SIMILAR TOLIKE 不同,POSIX 正则表达式语法不支持用户定义的转义字符。

其中一个字符表达式可以是 CHAR 或 VARCHAR 数据类型。如果它们不同,Amazon Redshift 会将 pattern 转换为 expression 的数据类型。

所有字符表达式都可以是 CHAR 或 VARCHAR 数据类型。如果表达式的数据类型不同,Amazon Redshift 会将其转换为 expression 的数据类型。

POSIX 模式匹配支持下列元字符:

POSIX 描述
. 匹配任何单个字符。
* 匹配零或多个匹配项。
+ 匹配一个或多个匹配项。
? 匹配零或一个匹配项。
| 指定替换匹配项;例如,E | H E表示 或 H
^ 匹配行首字符。
$ 匹配行尾字符。
$ 匹配字符串的结尾。
[ ] 括号指定一个匹配列表,它应与列表中的一个表达式匹配。脱字号 (^) 位于不匹配列表之前,它与列表中表示的表达式之外的任何字符匹配。
( ) 圆括号将项分组为单个逻辑项。
{m} 重复上一项目正好 m 次。
{m,} 重复上一项目 m 次或更多次。
{m,n} 重复上一项目至少 m 次且不超过 n 次。
[: :] 匹配 POSIX 字符类中的任何字符。在下列字符类中,Amazon Redshift 仅支持 ASCII 字符:[:alnum:][:alpha:][:lower:][:upper:]

Amazon Redshift 支持下列 POSIX 字符类。

字符类 描述
[[:alnum:]] 所有 ASCII 字母数字字符
[[:alpha:]] 所有 ASCII 字母字符
[[:blank:]] 所有空格字符
[[:cntrl:]] 所有控制字符(非打印)
[[:digit:]] 所有数字
[[:lower:]] 所有小写 ASCII 字母字符
[[:punct:]] 所有标点字符
[[:space:]] 所有空格字符(非打印)
[[:upper:]] 所有大写 ASCII 字母字符
[[:xdigit:]] 所有有效的十六进制字符

Amazon Redshift 在正则表达式中支持下列受 Perl 影响的运算符。使用两个反斜杠(“\\”)转义此运算符。 

操作符 描述 等效的字符类表达式
\\d 数字字符 [[:digit:]]
\\D 非数字字符 [^[:digit:]]
\\w 单词字符 [[:word:]]
\\W 非单词字符 [^[:word:]]
\\s 空格字符 [[:space:]]
\\S 非空格字符 [^[:space:]]
\\b 边界字

示例

下表显示了使用 POSIX 运算符的模式匹配的示例:

表达式 返回值
'abc' ~ 'abc' True
'abc' ~ 'a' True
'abc' ~ 'A' False
'abc' ~ '.*(b|d).*' True
'abc' ~ '(b|c).*' True
'AbcAbcdefgefg12efgefg12' ~ '((Ab)?c)+d((efg)+(12))+' True
'aaaaaab11111xy' ~ 'a{6}.[1]{5}(x|y){2}' True
'$0.87' ~ '\\$[0-9]+(\\.[0-9][0-9])?' True
'ab c' ~ '[[:space:]]' True
'ab c' ~ '\\s' True
' ' ~ '\\S' False

以下示例查找名称包含 EH 的城市:

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

以下示例查找名称不包含 EH 的城市:

SELECT DISTINCT city FROM users WHERE city !~ '.*E.*|.*H.*' ORDER BY city LIMIT 5; city ----------------- Aberdeen Abilene Ada Agat Agawam

以下示例使用转义字符串(“\\”)搜索包含句点的字符串。

SELECT venuename FROM venue WHERE venuename ~ '.*\\..*' ORDER BY venueid; venuename ------------------------------ St. Pete Times Forum Jobing.com Arena Hubert H. Humphrey Metrodome U.S. Cellular Field Superpages.com Center E.J. Nutter Center Bernard B. Jacobs Theatre St. James Theatre