#内置函数
函数是将零个或多个参数输入,执行特定的计算并将结果返回的操作,其一般形式可以表示为'function_name(argument1,argument2, ...)'。
函数支持数据类型的隐式转换:当输入参数的类型与函数预期的参数类型不同时,YashanDB会先尝试将其转换为可接受的类型。因此,在YashanDB中,函数的参数均可以为通用表达式(expr)(除非在函数定义中特殊说明)且表达式的结果不需要为函数要求的参数类型,只需满足系统隐式转换后符合参数类型的要求即可。
本章节介绍YashanDB中的内置函数,PL/SQL参考手册中将对用户自定义函数(User-Defined Function)进行介绍。
# 聚集函数(Aggregate Function)
聚集函数是对多行数据运算并返回一行数据的函数,此函数可以出现SELECT、ORDER BY和HAVING语句中,并通常与GROUP BY语句组合使用。
- 当没有指定GROUP BY语句时,聚集函数对所有行进行计算,并只返回一行计算结果。
- 当指定了GROUP BY语句时,聚集函数按GROUP BY后面的值进行分组计算,并对每个值返回一行计算结果。
- 当指定了GROUP BY语句,并同时指定了HAVING语句时,对上一条返回的多行计算结果按照HAVING后面的条件进行筛选再返回。
使用聚集函数时应注意以下几点:
- 聚集函数都具有确定性,任何时候用一组给定的输入值调用它们时,都返回相同的值。
- 向聚集函数输入的参数必须有且只能有一个。例如:不支持'COUNT(c1, c2)',仅支持'COUNT(c1)'。
- 除了'COUNT(*)'、'COUNT(常量)',其他聚集函数会忽略NULL;当所有行均为NULL时,这些函数返回NULL。
- 聚集函数不支持嵌套,即聚集函数的参数不可以为聚集函数。
- 聚集函数不支持与FOR UPDATE语句组合使用。
- 部分聚集函数可通过使用OVER关键字作为窗口函数使用,详情见各函数章节。
YashanDB提供如下聚集函数:
# 日期函数(Datetime Function)
日期函数是分别对每行数据运算并对其返回一行数据的函数,此类函数的参数或返回结果中包含日期型数据。
YashanDB提供如下日期函数:
# 字符函数(Character Function)
字符函数是分别对每行数据运算并对其返回一行数据的函数,此类函数的操作对象主要为字符型数据。
YashanDB提供如下字符函数:
# 数学函数(Mathematical Function)
数学函数是分别对每行数据运算并对其返回一行数据的函数,此类函数主要对数值型数据进行数学运算,并返回一个数值型数据。
YashanDB提供如下数学函数:
# 转换函数(Conversion Function)
转换函数是分别对每行数据运算并对其返回一行数据的函数,此类函数将数据从一种类型转换到另一种类型。
YashanDB提供如下转换函数:
# 窗口函数(Window Function)
窗口为标准的SQL术语,表示一个数据行的集合,窗口函数则是系统提供的操作这个数据行集合的各种功能,其与聚集函数的区别是,聚集函数的每个分组返回一个值,而窗口函数的每个分组按行返回多个值。
窗口函数的通用语法可表述为:([]表示可省略)
WINDOW_FUNC = WINDOW_FUNC([func_parameter]) OVER ([query_partition_clause] [order_by_clause [ windowing_clause]])
query_partition_clause用于对表数据进行分组,可省略,则表示所有数据为一个分组。expr不能为NULL,且可以为:
- 列字段
- 常量表达式:可以为任意常量值,等价于不分组
order_by_clause用于对分组内的数据行进行排序,可省略。语法同SELECT语句中的order_by_clause描述。
windowing_clause用于对分组内的数据行进行进一步的筛选,每个分组通过BETWEEN ...AND自定义各自的窗口行范围,即滑动窗口,只有部分窗口函数可以使用此功能。基于此特性,此功能需要与order_by_clause结合使用,保证筛选的基础为有序的行集合。
- ROWS:使用相对当前行偏移行数来计算行范围。
- RANGE:使用相对当前行的值差异来计算行范围,此功能要求order_by_clause排序值为数值型或日期型。
- UNBOUNDED PRECEDING:以分组的第一行作为开始行。
- UNBOUNDED FOLLOWING:以分组的最后一行作为结束行。
- CURRENT ROW:以当前行作为开始或者结束行。
- value_expr (PRECEDING|FOLLOWING):通过value_expr来计算开始行和结束行(ROWS),或者开始行的值和结束行的值(RANGE),在列存表上只支持常量。例如,ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING表示以当前行的前一行作为开始行和后一行作为结束行,窗口函数基于此范围执行分析统计。
使用窗口函数时应注意:
- 窗口函数不能被嵌套,即不能使用窗口函数作为窗口函数的参数。
- 窗口函数一般应用于SELECT语句中的select_list,或ORDER BY语句中。
- 分布式部署中不支持使用窗口函数。
YashanDB提供如下专用窗口函数:
同时,部分其他类型的函数也可作为窗口函数使用,通过OVER关键字识别,例如:
可查看V$WINDOW_FUNCTION视图了解YashanDB提供的所有窗口函数信息 。
# 数组函数(Varray Function)
数组函数指的是对数组(数组变量,数组对象,数组类型)进行操作或生成数组对象的函数,即其入参或返回值中至少包含一个数组类型值。
# 内置表函数(Table Function)
内置表函数是指以table()语法调用的一类函数,函数内部可以输入不同的标识符,实现不同类型数据的聚集查询。