跳转至

使用函数和操作符

使用函数和操作符

用户定义和内置函数和运算符的说明。

函数使用整体说明

在SeaboxMPP数据库中调用函数时,函数属性控制函数的执行。易变性属性 (IMMUTABLE, STABLE,VOLATILE) 和EXECUTE ON 属性控制函数执行的两个不同方面。一般来说,易变性指示函数执行时间, EXECUTE ON指示执行位置。易变性属性是基于SeaboxSQL的属性, EXECUTE ON 属性是SeaboxMPP的属性。

例如,使用IMMUTABLE属性定义的函数可以在查询计划时执行,而使用VOLATILE属性定义的函数,必须对查询中每一行执行。

使用EXECUTE ON MASTER属性的函数仅在主实例上执行,而使用EXECUTE ON ALL SEGMENTS属性的函数在所有主executor实例(而不是主服务器)上执行。

这些表总结了SeaboxMPP数据库基于这些属性,对函数执行的假设。

函数属性 SeaboxMPP支持 描述 注释
IMMUTABLE 支持 仅直接依赖信息参数列表。如果给定相同的参数值,则始终返回同样的结果。
STABLE 大部分情况下支持 在一个单一表扫描中,相同的参数值返回相同的结果,但是不同的SQL语句结果会改变。 结果依赖于数据库查找或者参数值。current_timestamp函数族是STABLE的,在一次执行中值不会改变。
VOLATILE 受限 在一个单一表扫描中函数值可能会改变。例如:random(), timeofday(),这是默认属性。 任何有副作用的函数都是volatile,即使它的结果是可预测的也一样。例如:setval()

表 1. SeaboxMPP数据库的函数易变性

函数属性 描述 注释
EXECUTE ON ANY 表示函数可以在coordinator或任意executor实例上执行,并且返回相同的结果,而不管它在何处执行。这是默认属性。 SeaboxMPP数据库决定函数的执行位置。
EXECUTE ON MASTER 表示必须在coordinator实例上执行函数。 如果用户定义函数执行查询以访问表,请指定此属性。
EXECUTE ON ALL SEGMENTS 表示对于每个调用,函数必须在所有主executor实例上执行,而不是在coordinator上执行。

表 2. SeaboxMPP数据库的EXECUTE ON函数属性

可以使用ssql \df+ function命令显示函数的易变性和EXECUTE ON属性。

更多有关SeaboxMPP数据库函数易变性分类的信息,请参考SeaboxSQL文档函数易变性分类

更多关于EXECUTE ON属性的信息, 参看 创建函数.

在SeaboxMPP数据库中,数据被划分为多个段-每个段都是一个不同的SeaboxSQL数据库。为了防止不一致或意外的结果,如果函数包含SQL命令或者任意修改数据库的方式,请不要在executor级别执行被分类为volatile的函数。

例如,不允许对SeaboxMPP数据库中的分布式数据setval()等函数,因为它们可能导致段实例之间的数据不一致。

函数可以对executor上的复制表(DISTRIBUTED REPLICATED)执行只读查询,但修改数据的任何SQL命令都必须在coordinator实例上执行。

注意: 隐藏的系统列(rowidctidcmincmaxxminxmaxsc_dbindex_id)无法在复制表的用户查询中引用,因为它们没有单一的,明确的值。SeaboxMPP数据库为查询返回一个column does not exist错误。

为了确保数据的一致性,您可以在主服务器上安全地运行语句来调用使用VOLATILESTABLE的函数。例如,下面的语句在coordinator上运行(不带FROM子句的语句):

SELECT setval('myseq', 201);
SELECT foo();

如果语句有一个包含分布式表的FROM子句,而FROM子句中的函数返回一组行,则该语句可以在以下executor上运行:

SELECT * from foo();

SeaboxMPP数据库不支持返回表引用(rangeFuncs)的函数或使用refCursor数据类型的函数。

对于计划和立即执行的简单交互式查询,STABLEIMMUTABLE的函数易变性类别之间的差异相对较小。无论是在计划期间执行一次函数,还是在查询执行启动期执行一次函数,都无关紧要。但是,当您保存计划并稍后重用它时,会有很大的不同。如果把一个函数误标为IMMUTABLE,SeaboxMPP数据库可能在规划时会过早地把它折叠成一个常量,可能会在计划的后续执行期间重用过时的值。当使用PREPARE 语句或使用PL/pgSQL之类的语言缓存计划时,可能会遇到这种危险。

用户自定义函数

SeaboxMPP数据库支持用户定义的函数。更多信息请见SeaboxSQL文档中的 Extending SQL

使用CREATE FUNCTION语句注册用户定义的函数,它们可以按在在SeaboxMPP数据库中使用函数中所述的方式被使用。默认情况下,用户定义的函数被声明为VOLATILE,因此如果用户定义的函数是IMMUTABLE或者STABLE,必须在注册该函数时指定正确的易变性级别。

默认情况下,用户定义的函数被声明为EXECUTE ON ANY。只有当函数在coordinator实例上执行时,才支持执行查询以访问表的函数,除非函数可以执行仅访问executor实例上复制表的SELECT命令。访问散列分布表或随机分布表的函数必须用EXECUTE ON MASTER属性定义。否则,在复杂的查询中使用函数时,函数可能返回不正确的结果。如果没有该属性,规划器优化可能会将函数调用推送到executor实例中执行。

在创建用户定义的函数时,避免使用致命错误或者破坏性的调用。SeaboxMPP数据库可能会用突然的关闭或者重启来应对这些错误。

在SeaboxMPP数据库中,用户定义的函数的共享库必须位于SeaboxMPP数据库阵列的所有主机(Coordinator、executor以及镜像)上的同一库路径地址。

还可以创建并执行用SeaboxMPP数据库过程语言(例如PL/pgSQL)编写的匿名代码块。匿名块作为短暂的匿名函数运行。有关创建和执行匿名块的信息,请见DO命令。

内建函数和操作符整体说明

以下是出了SeaboxSQL支持的内建函数和操作符的分类。SeaboxMPP数据库中支持SeaboxSQL中所有的函数和操作符,除了STABLE以及VOLATILE函数之外,这两种服从在SeaboxMPP数据库中使用函数中记录的限制在SeaboxMPP数据库中使用函数

SeaboxMPP数据库包括操作json数据类型值的JSON处理函数。有关JSON数据的信息,请见使用JSON数据使用JSON数据

  • 逻辑操作符

  • VOLATILE函数: 无

  • STABLE函数: 无

  • 限制: 无

  • 比较操作符

  • VOLATILE函数: 无

  • STABLE函数: 无

  • 限制: 无

  • 数学函数和操作符

  • VOLATILE函数: random(),setseed()

  • STABLE函数: 无

  • 限制: 无

  • 字符串函数和操作符

  • VOLATILE函数: 所有内置转换操作符

  • STABLE函数: convert(),pg_client_encoding()

  • 限制: 无

  • 二进制串函数和操作符

  • VOLATILE函数: 无

  • STABLE函数: 无

  • 限制: 无

  • 位串函数和操作符

  • VOLATILE函数: 无

  • STABLE函数: 无

  • 限制: 无

  • 模式匹配

  • VOLATILE函数: 无

  • STABLE函数: 无

  • 限制: 无

  • 数据类型格式化函数

  • VOLATILE函数: 无

  • STABLE函数: to_char()to_timestamp()

  • 限制: 无

  • 日期/时间函数和操作符

  • VOLATILE函数: timeofday()

  • STABLE函数: age()current_date()current_time()current_timestamp()localtime()localtimestamp()now()

  • 限制: 无

  • 枚举支持函数

  • VOLATILE函数: 无

  • STABLE函数: 无

  • 限制: 无

  • 几何函数和操作符

  • VOLATILE函数: 无

  • STABLE函数: 无

  • 限制: 无

  • 网络地址函数和操作符

  • VOLATILE函数: 无

  • STABLE函数: 无

  • 限制: 无

  • 序列操纵函数

  • VOLATILE函数: nextval()setval()

  • STABLE函数: 无

  • 限制: 无

  • 条件表达式

  • VOLATILE函数: 无

  • STABLE函数: 无

  • 限制: 无

  • 数组函数和操作符

  • VOLATILE函数: 无

  • STABLE函数: 所有数组函数

  • 限制: 无

  • 聚集函数

  • VOLATILE函数: 无

  • STABLE函数: 无

  • 限制: 无

  • 子查询表达式

  • VOLATILE函数: 无

  • STABLE函数: 无

  • 限制: 无

  • 行及数组比较

  • VOLATILE函数: 无

  • STABLE函数: 无

  • 限制: 无

  • 集合返回函数

  • VOLATILE函数: generate_series()

  • STABLE函数: 无

  • 限制: 无

  • 系统信息函数

  • VOLATILE函数: 无

  • STABLE函数: 所有会话信息函数、所有访问权限查询函数、所有模式可见性查询函数、所有系统目录信息函数、所有注释信息函数、所有事务ID和快照

  • 限制: 无

  • 系统管理函数

  • VOLATILE函数: set_config()pg_cancel_backend()pg_terminate_backend()pg_reload_conf()pg_rotate_logfile()pg_start_backup()pg_stop_backup()pg_size_pretty()pg_ls_dir()pg_read_file()pg_stat_file()

  • STABLE函数: current_setting()、所有数据库对象大小函数

  • 限制: pg_column_size() 函数显示存储该值所需的字节,可能使用toast压缩

  • XML函数和类似函数的表达式

  • VOLATILE函数: 无

  • STABLE函数: cursor_to_xml() cursor_to_xmlschema() database_to_xml() database_to_xmlschema() database_to_xml_and_xmlschema() query_to_xml() query_to_xmlschema() query_to_xml_and_xmlschema() schema_to_xml() schema_to_xmlschema() schema_to_xml_and_xmlschema() table_to_xml() table_to_xmlschema() table_to_xml_and_xmlschema() xmlagg() xmlconcat() xmlelement() xmlexists() xmlforest) xml_is_well_formed() xml_is_well_formed_document() xml_is_well_formed_content() xmlparse ( ) xpath() xpath_exists() xmlpi() xmlroot() xmlserialize () xml() text() xmlcomment() xmlconcat2()

  • 限制: 无

窗口函数

下列内建窗口函数是SeaboxMPP对于SeaboxSQL数据库的扩展。所有的窗口函数都是immutable。更多有关窗口函数的信息,请见窗口表达式.

表 窗口函数

函数 返回类型 描述
cume_dist() double precision 计算一组值中一个值的累积分布。具有相等值的行总是具有相同的累积分布值。。
dense_rank() bigint 计算一个有序行组中一行的无跳跃排名值的排名。具有相等值的行会得到相同的排名值。
first_value() 与输入一致 返回一个有续值集合中的第一个值。
lag() 与输入一致 在不做自连接的情况下,提供对于同一个表中多于一行的访问。给定一个查询返回的一系列行以及该游标的一个位置,LAG提供对位于该位置之前一个给定物理偏移量的行的访问。默认的offset为1。 default设置当偏移量超出窗口范围之外时要返回的值。如果没有指定default,默认值是空值。
last_value() 与输入一致 返回一个有序值集合中的最后一个值。
lead() 与输入一致 在不做自连接的情况下,提供对于同一个表中多于一行的访问。给定一个查询返回的一系列行以及该游标的一个位置,lead提供对位于该位置之后一个给定物理偏移量的行的访问。如果没有指定offset,默认偏移量是1。default设置当偏移量超出窗口范围之外时要返回的值。如果没有指定default,默认值是空值。
ntile() bigint 把一个有序数据集划分成一些桶(由expr)定义)并且为每一行分配一个桶号。
percent_rank() double precision 计算一个假设行R的排名减1,然后除以被计算的行数(在一个窗口分区内)减1。
rank() bigint 计算一行在一个有序值组中的排名。根据排名标准有相等值的行得到相同的排名。被占用的行数被加到排名数上来计算下一个排名值。在这种情况下,排名可能不是连续的数字。
row_number() bigint 为窗口分区中的每一行或者查询中的每一行分配一个唯一的编号。
高级聚集函数

下列内建高级聚集函数是SeaboxMPP对SeaboxSQL数据库的扩展。这些函数都是属于immutable类型的。

SeaboxMPP数据库不支持SeaboxSQL有序集聚合函数。

注意: 用于分析的SeaboxMPP MADlib扩展提供了额外的高级函数来执行对SeaboxMPP数据库数据的统计分析和机器学习。

  • MEDIAN (expr)
语法
MEDIAN (expression)
返回类型
timestamp, timestamptz, interval, float
描述
可以用一个二维数组作为输入。把这些数组当作矩阵。
示例
sql SELECT department_id, MEDIAN(salary) FROM employees GROUP BY department_id;
  • sum(array[])
语法
sum(array[[1,2],[3,4]])
返回类型
smallint[]int[], bigint[], float[]
描述
执行矩阵求和。可以将被视为矩阵的二维数组作为输入。
示例
``` sql CREATE TABLE mymatrix (myvalue int[]); INSERT INTO mymatrix VALUES (array[[1,2],[3,4]]); INSERT INTO mymatrix VALUES (array[[0,1],[1,0]]); SELECT sum(myvalue) FROM mymatrix; sum
{{1,3},{4,4}} ```
  • pivot_sum (label[], label, expr)
语法
pivot_sum( array['A1','A2'], attr, value)
返回类型
int[], bigint[], float[]
描述
使用sum来解决重复项的pivot聚集。
  • unnest (array[])
语法
unnest( array['one', 'row', 'per', 'item'])
返回类型
anyelement集合
描述
把一个一维数组转换成行。返回一个anyelement(一种多态伪类型,请见SeaboxSQL中的伪类型)集合。