Amazon Redshift
数据库开发人员指南 (API Version 2012-12-01)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

POSIX 运算符

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

注意

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

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

语法

Copy
expression [ ! ] ~ pattern

参数

expression

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

!

求反运算符。

~

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

pattern

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

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

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

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

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

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

POSIX 描述
. 匹配任何单个字符。
* 匹配零或多个匹配项。
+ 匹配一个或多个匹配项。
? 匹配零或一个匹配项。
| 指定替换匹配项;例如,E | H 表示 EH
^ 匹配行首字符。
$ 匹配行尾字符。
$ 匹配字符串的结尾。
[ ] 括号指定一个匹配列表,它应与列表中的一个表达式匹配。脱字号 (^) 位于不匹配列表之前,它与列表中表示的表达式之外的任何字符匹配。
( ) 圆括号将项分组为单个逻辑项。
{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:]]

示例

下表显示了使用 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 的所有城市:

Copy
select distinct city from users where city ~ '.*E.*|.*H.*' order by city; city ----------------------- Agoura Hills Auburn Hills Benton Harbor Beverly Hills Chicago Heights Chino Hills Citrus Heights East Hartford

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

Copy
select venuename from venue where venuename ~ '.*\\..*'; venuename ----------------------------- Bernard B. Jacobs Theatre E.J. Nutter Center Hubert H. Humphrey Metrodome Jobing.com Arena St. James Theatre St. Pete Times Forum Superpages.com Center U.S. Cellular Field

本页内容: