PostgreSQL基础回顾(第 9 章 函数和操作符)

来源:http://www.postgres.cn/docs/11/

9.7. 模式匹配 

PostgreSQL提供了三种独立的实现模式匹配的方法:SQL LIKE操作符、更近一些的SIMILAR TO操作符(SQL:1999 里添加进来的)和POSIX-风格的正则表达式。除了这些基本的这个串匹配这个模式吗?”操作符外,还有一些函数可用于提取或替换匹配子串并在匹配位置分离一个串。

9.7.1. LIKE

pattern里的下划线 (_)代表(匹配)任何单个字符; 而一个百分号(%)匹配任何零或更多个字符的序列。

要匹配文本的下划线或者百分号,而不是匹配其它字符, 在pattern里相应的字符必须 前导逃逸字符。缺省的逃逸字符是反斜线,但是你可以用ESCAPE子句指定一个不同的逃逸字符。 要匹配逃逸字符本身,写两个逃逸字符。 

关键字ILIKE可以用于替换LIKE, 它令该匹配根据活动区域成为大小写无关。这个不属于SQL标准而是一个PostgreSQL扩展。

操作符~~等效于LIKE, 而~~*对应ILIKE。 还有 !~~!~~*操作符分别代表NOT LIKENOT ILIKE。所有这些操作符都是PostgreSQL特有的。 

9.7.2. SIMILAR TO正则表达式

SIMILAR TO操作符根据自己的模式是否匹配给定串而返回真或者假。 它和LIKE非常类似,只不过它使用 SQL 标准定义的正则表达式理解模式。 

9.7.3. POSIX正则表达式

表 9.14列出了所有可用于 POSIX 正则表达式模式匹配的操作符。表 9.14. 正则表达式匹配操作符

操作符描述例子
~ 匹配正则表达式,大小写敏感 'thomas' ~ '.*thomas.*'
~* 匹配正则表达式,大小写不敏感 'thomas' ~* '.*Thomas.*'
!~ 不匹配正则表达式,大小写敏感 'thomas' !~ '.*Thomas.*'
!~* 不匹配正则表达式,大小写不敏感 'thomas' !~* '.*vadim.*'

 

POSIX正则表达式提供了比LIKESIMILAR TO操作符更强大的含义。

9.21. 窗口函数

窗口函数提供在与当前查询行相关的行集合上执行计算的能力。有关这个特性的介绍请见第 3.5 节。 语法细节则请见第 4.2.8 节

表 9.57列出了内建的窗口函数。注意必须使用窗口函数的语法调用这些函数; 一个OVER子句是必需的。

在这些函数之外,任何内建的或者用户定义的通用或者统计性聚集(即非有序集和假想集聚集)都可以被用作一个窗口函数,内建聚集的列表请见第 9.20 节。仅当聚集函数调用后面跟着一个OVER子句时,聚集函数才会像窗口函数那样工作,否则它们会按非窗口聚集的方式运行并且为整个集合返回一个单一行。

表 9.57. 通用窗口函数

函数返回类型描述
row_number() bigint 当前行在其分区中的行号,从1计
rank() bigint 带间隙的当前行排名; 与该行的第一个同等行的row_number相同
dense_rank() bigint 不带间隙的当前行排名; 这个函数计数同等组
percent_rank() double precision 当前行的相对排名: (rank- 1) / (总行数 - 1)
cume_dist() double precision 累积分布:(在当前行之前或者平级的分区行数) / 分区行总数
ntile(num_buckets integer) integer 从1到参数值的整数范围,尽可能等分分区
lag(value anyelement [, offset integer [, default anyelement ]]) value的类型相同 返回value,它在分区内当前行的之前offset个位置的行上计算;如果没有这样的行,返回default替代(必须和value类型相同)。offsetdefault都是根据当前行计算的结果。如果忽略它们,则offset默认是1,default默认是空值
lead(value anyelement [, offset integer [, default anyelement ]]) value类型相同 返回value,它在分区内当前行的之后offset个位置的行上计算;如果没有这样的行,返回default替代(必须和value类型相同)。offsetdefault都是根据当前行计算的结果。如果忽略它们,则offset默认是1,default默认是空值
first_value(value any) same type as value 返回在窗口帧中第一行上计算的value
last_value(value any) value类型相同 返回在窗口帧中最后一行上计算的value
nth_value(value anynth integer) value类型相同 返回在窗口帧中第nth行(行从1计数)上计算的value;没有这样的行则返回空值

 

表 9.57中列出的所有函数都依赖于相关窗口定义的ORDER BY子句指定的排序顺序。仅考虑ORDER BY列时不能区分的行被称为是同等行。定义的这四个排名函数(包括 cume_dist),对于任何两个同等行的答案相同。

 

窗口帧 

这里有一个与窗口函数相关的重要概念:对于每一行,在它的分区中的行集被称为它的窗口帧。 一些窗口函数只作用在窗口帧中的行上,而不是整个分区。默认情况下,如果使用ORDER BY,则帧包括从分区开始到当前行的所有行,以及后续任何与当前行在ORDER BY子句上相等的行。如果ORDER BY被忽略,则默认帧包含整个分区中所有的行。 [4] 下面是使用sum的例子: 

SELECT salary, sum(salary) OVER () FROM empsalary; 
 salary |  sum
--------+-------
   5200 | 47100
   5000 | 47100
   3500 | 47100
   4800 | 47100
   3900 | 47100
   4200 | 47100
   4500 | 47100
   4800 | 47100
   6000 | 47100
   5200 | 47100
(10 rows) 

如上所示,由于在OVER子句中没有ORDER BY,窗口帧和分区一样,而如果缺少PARTITION BY则和整个表一样。换句话说,每个合计都会在整个表上进行,这样我们为每一个输出行得到的都是相同的结果。但是如果我们加上一个ORDER BY子句,我们会得到非常不同的结果: 

SELECT salary, sum(salary) OVER (ORDER BY salary) FROM empsalary; 
 salary |  sum
--------+-------
   3500 |  3500
   3900 |  7400
   4200 | 11600
   4500 | 16100
   4800 | 25700
   4800 | 25700
   5000 | 30700
   5200 | 41100
   5200 | 41100
   6000 | 47100
(10 rows)

 这里的合计是从第一个(最低的)薪水一直到当前行,包括任何与当前行相同的行(注意相同薪水行的结果)。

posted @ 2020-05-07 16:42  King様  阅读(385)  评论(0编辑  收藏  举报