Amazon Redshift
数据库开发人员指南 (API Version 2012-12-01)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

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

本页内容: