#内置函数

函数是将零个或多个参数输入,执行特定的计算并将结果返回的操作,其一般形式可以表示为'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提供如下聚集函数:

AVG

COUNT

GROUP_CONCAT

MAX

MIN

STDDEV

STDDEV_POP

STDDEV_SAMP

SUM

VAR_POP

VAR_SAMP

VARIANCE

WM_CONCAT

# 日期函数(Datetime Function)

日期函数是分别对每行数据运算并对其返回一行数据的函数,此类函数的参数或返回结果中包含日期型数据。

YashanDB提供如下日期函数:

ADD_MONTHS

AGE

CURRENT_TIMESTAMP

DATE

DATE_ADD

DATE_FORMAT

DAYOFWEEK

EXTRACT

LAST_DAY

MONTHS_BETWEEN

NOW

SYSDATE

SYSTIMESTAMP

TIME

TIMEDIFF

TIMESTAMP

TIMESTAMPDIFF

UTC_TIMESTAMP

# 字符函数(Character Function)

字符函数是分别对每行数据运算并对其返回一行数据的函数,此类函数的操作对象主要为字符型数据。

YashanDB提供如下字符函数:

ASCII

BIT_LENGTH

CHAR_LENGTH/CHARACTER_LENGTH

CHR

CONCAT

CONCAT_WS

FIND_IN_SET

INITCAP

INSTR

LEFT

LENGTH/LENGTHB

LOWER

LPAD

LTRIM

NLSSORT

OCTET_LENGTH

POSITION

REGEXP_COUNT

REGEXP_INSTR

REGEXP_LIKE

REGEXP_REPLACE

REGEXP_SUBSTR

REPLACE

RIGHT

RPAD

RTRIM

SPLIT

STRING_AGG

STRPOS

SUBSTR

SUBSTRING

SUBSTRING_INDEX

TO_BASE64

TRANSLATE

TRIM

UPPER

LISTAGG

# 数学函数(Mathematical Function)

数学函数是分别对每行数据运算并对其返回一行数据的函数,此类函数主要对数值型数据进行数学运算,并返回一个数值型数据。

YashanDB提供如下数学函数:

ABS

ACOS

ASIN

ATAN

ATAN2

BITAND/BITOR/BITXOR

CEIL

COS

COT

DIV

EXP

FLOOR

LN

LOG

MOD

PI

POW/POWER

RANDOM

ROUND

SIGN

SIN

SINH

SQRT

TAN

TANH

TRUNC

# 转换函数(Conversion Function)

转换函数是分别对每行数据运算并对其返回一行数据的函数,此类函数将数据从一种类型转换到另一种类型。

YashanDB提供如下转换函数:

BIN

BIN_TO_NUM

CAST

HEXTORAW

NUMTODSINTERVAL

NUMTOYMINTERVAL

SCN_TO_TIMESTAMP

TIMESTMAP_TO_SCN

TO_CHAR

TO_DATE

TO_DSINTERVAL

TO_NUMBER

TO_TIMESTAMP

TO_YMINTERVAL

# 窗口函数(Window Function)

窗口为标准的SQL术语,表示一个数据行的集合,窗口函数则是系统提供的操作这个数据行集合的各种功能,其与聚集函数的区别是,聚集函数的每个分组返回一个值,而窗口函数的每个分组按行返回多个值。

窗口函数的通用语法可表述为:([]表示可省略)

WINDOW_FUNC = WINDOW_FUNC([func_parameter]) OVER ([query_partition_clause] [order_by_clause [ windowing_clause]])

query_partition_clause
PARTITION BY expr , ( expr , )

query_partition_clause用于对表数据进行分组,可省略,则表示所有数据为一个分组。expr不能为NULL,且可以为:

  • 列字段
  • 常量表达式:可以为任意常量值,等价于不分组
order_by_clause
ORDER BY expr position c_alias ASC DESC NULLS FIRST NULLS LAST ,

order_by_clause用于对分组内的数据行进行排序,可省略。语法同SELECT语句中的order_by_clause描述。

windowing_clause
ROWS RANGE BETWEEN UNBOUNDED PRECEDING CURRENT ROW value_expr PRECEDING FOLLOWING AND UNBOUNDED FOLLOWING CURRENT ROW value_expr PRECEDING FOLLOWING UNBOUNDED PRECEDING CURRENT ROW value_expr PRECEDING

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提供如下专用窗口函数:

DENSE_RANK

FIRST_VALUE

LAG

LAST_VALUE

LEAD

RANK

ROW_NUMBER

同时,部分其他类型的函数也可作为窗口函数使用,通过OVER关键字识别,例如:

AVG

COUNT

MAX

MIN

SUM

可查看V$WINDOW_FUNCTION视图了解YashanDB提供的所有窗口函数信息 。

# 数组函数(Varray Function)

数组函数指的是对数组(数组变量数组对象数组类型)进行操作或生成数组对象的函数,即其入参或返回值中至少包含一个数组类型值。

ARRAY_APPEND

ARRAY_LENGTH

ARRAY_NDIMS

ARRAY_POSITION

ARRAY_REMOVE

ARRAY_REPLACE

ARRAY_TO_STRING

ARRAY_UPPER

STRING_TO_ARRAY

# 内置表函数(Table Function)

内置表函数是指以table()语法调用的一类函数,函数内部可以输入不同的标识符,实现不同类型数据的聚集查询。

PX_CHANNEL

PX_OBJ

# 其他函数(Other Function)

BENCHMARK

COALESCE

CHECK_SYS_PRIVILEGE

DECODE

EMPTY_BLOB

EMPTY_CLOB

GREATEST

IF

IFNULL

ISNULL

JSON

JSON_ARRAY_GET

JSON_ARRAY_LENGTH

JSON_EXISTS

JSON_QUERY

JSON_SERIALIZE

LEAST

LNNVL

LOCALTIME

LOCALTIMESTAMP

MD5

NEXT_DAY

NULLIF

NVL

NVL2

TYPEOF

UNSUPPORT_ERROR

USERENV

SYS_CONNECT_BY_PATH

SYS_CONTEXT

SYS_EXTRACT_UTC

SYS_GUID

SQLCODE

SQLERRM