1、模式匹配
pg中提供3种模式匹配的方法:传统SQL LIKE 操作;最近的SIMILAR TO操作(1999添加到SQL);POSIX-style正则表达式。
函数可用来提取or替换一个匹配的子字符串从匹配的位置。若你有超越这种模式匹配的需求,可以考虑在Perl或Tcl中写一个自定义的函数。
1.1、传统SQL LIKE 操作
string LIKE pattern [ESCAPE escape-character]
string NOT LIKE pattern [ESCAPE escape-character]
若string匹配提供的pattern,则like表达式返回true,NOT与之相反。
若pattern中不含有"%" 或"_"符号,则pattern仅仅代表string自己,这种情况下LIKE操作符就像等于操作符。
"_":匹配任何单个字符
"%":匹配任何序列的0个或多个字符
如:
'abc' LIKE 'abc' true
'abc' LIKE 'a%' true
'abc' LIKE '_b_' true
'abc' LIKE 'c' false
LIKE模式匹配总是涉及整个字符串,因此,若想要匹配一个字符串中任何一个序列,则该pattern需要以"%"开始和结尾。
匹配字面的"%" 或"_"符号,通过在pattern中使用escape字符(转义字符),默认的转义字符是一个"\",但也可以使用ESCAPE从句。为匹配escape字符本身,需要写2个escape字符。
也可以通过写 ESCAPE ''来选择no escape字符,这将有效的禁止escape机制,从而使它不可能关掉"%" 或"_"符号的特殊意义。
关键字ILIKE可以替换LIKE,根据活动的地区使得大小写不敏感。此不是SQL标准却是PG扩展
"~~" 等价于 LIKE;"~~*" 等价于 ILIKE("!~~"/"!~~*"代表NOT LIKE 和NOT ILIKE)
1.2、SIMILAR TO正则表达式
string SIMILAR TO pattern [ESCAPE escape-character]
string NOT SIMILAR TO pattern [ESCAPE escape-character]
类似于LIKE,除了它解析pattern使用SQL标准正则表达式外,SQL正则表达式在LIKE符号和通用正则表达式符号之上。
只有它的pattern匹配整个字符串时,该SIMILAR TO成功。这是不同于常见的正则表达式的行为模式可以匹配任何字符串的一部分。也像LIKE,SIMILAR TO 使用"%" 或"_"符号作为一个通配符代表任何字符串or单个字符。
除了借用了LIKE的这些特性, SIMILAR TO 借用POSIX正则表达式支持模式匹配的通配符:
| 2个选择中的任何一个
* 重复前一个项0次or更多次
+ 重复前一个项1次or更多次
? 重复前一个项0次or 1次
{m} 重复前一个项m次
{m,} 重复前一个项m次or更多次
{m,n} 重复前一个项至少m次,不超过n次
Parentheses() 组合项到一个逻辑项
[...] 指明一个字符类,就像在POSIX正则表达式里的一样
如:
'abc' SIMILAR TO 'abc' true
'abc' SIMILAR TO 'a' false
'abc' SIMILAR TO '%(b|d)%' true
'abc' SIMILAR TO '(b|c)%' false
substring(string from pattern for escape-character),提供抽取匹配SQL正则表达式的子字符串函数,与使用SIMILAR TO一样,指定的pattern必须匹配整个字符串,
否则函数失败并返回null,返回标识模式的一部分表示成功,pattern必须包含2个出现的escape字符紧随其后的是一个双引号",文本匹配模式的一部分返回这些标记之间。
如:#"限制返回字符串
substring('foobar' from '%#"o_b#"%' for '#') oob
substring('foobar' from '#"o_b#"%' for '#') NULL
1.3、POSIX-style正则表达式
正则表达式匹配操作符:
操作符 描述 例子
~ 匹配正则表达式,大小写敏感 'thomas' ~ '.*thomas.*'
~* 匹配正则表达式,大小写不敏感 'thomas' ~* '.*Thomas.*'
!~ 不匹配正则表达式,大小写敏感 'thomas' !~ '.*Thomas.*'
!~* 不匹配正则表达式,大小写不敏感 'thomas' !~* '.*vadim.*'
POSIX正则表达式为模式匹配提供比使用LIKE和SIMILAR TO更强大的方式。
正则表达式是一个缩写的定义一组字符串的一个字符序列