#内置函数

函数是将零个或多个参数输入,执行特定的计算并将结果返回的操作,其一般形式可以表示为function_name(argument1,argument2, ...)

函数支持数据类型的隐式转换:当输入参数的类型与函数预期的参数类型不同时,YashanDB会先尝试将其转换为可接受的类型,然后再进行计算。因此,在YashanDB中,函数的参数均可以为通用表达式(expr)(除非在函数定义中特殊说明)且表达式的结果不需要为函数要求的参数类型,只需满足系统隐式转换后符合参数类型的要求即可。

本章节介绍YashanDB中的内置函数,PL参考手册中将对用户自定义函数(User-Defined Function)进行介绍,可查看V$FUNCTION视图了解YashanDB提供的所有内置函数信息。

# 聚集函数(Aggregate Function)

聚集函数是对多行数据运算并返回一行数据的函数,此函数可以出现在SELECT、ORDER BY和HAVING语句中,并通常与GROUP BY语句组合使用。

  • 当没有指定GROUP BY语句时,聚集函数对所有行进行计算,并只返回一行计算结果。
  • 当指定了GROUP BY语句时,聚集函数按GROUP BY后面的值进行分组计算,并对每个值返回一行计算结果。
  • 当指定了GROUP BY语句,并同时指定了HAVING语句时,对上一条返回的多行计算结果按照HAVING后面的条件进行筛选再返回。

使用聚集函数时应注意以下几点:

  • 聚集函数都具有确定性,任何时候用一组给定的输入值调用它们时,都返回相同的值。
  • 向聚集函数输入的参数必须有且只能有一个。例如COUNT(c1)
  • 除了COUNT(*)COUNT(常量),其他聚集函数会忽略NULL;当所有行均为NULL时,这些函数返回NULL。
  • 聚集函数不允许嵌套,即聚集函数的参数不可以为聚集函数。
  • 聚集函数不允许与FOR UPDATE语句组合使用。
  • 部分聚集函数可通过使用OVER关键字作为窗口函数使用,详情见各函数章节。

YashanDB提供如下聚集函数:

AVG

COUNT

GROUPING

GROUPING_ID

GROUP_CONCAT

GROUP_ID

LISTAGG

MAX

MEDIAN

MIN

PERCENTILE_CONT

STDDEV

STDDEV_POP

STDDEV_SAMP

STRING_AGG

SUM

VARIANCE

VAR_POP

VAR_SAMP

WM_CONCAT

# 日期函数(Datetime Function)

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

YashanDB提供如下日期函数:

ADD_MONTHS

AGE

CURRENT_TIMESTAMP

DATE

DATE_ADD

DATE_FORMAT

DATE_SUB

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

INSTRB

LEFT

LENGTH/LENGTHB

LENGTH2

LOWER

LPAD

LSFA_LISTAGG

LTRIM

NLSSORT

OCTET_LENGTH

POSITION

REGEXP_COUNT

REGEXP_INSTR

REGEXP_LIKE

REGEXP_REPLACE

REGEXP_SUBSTR

REPLACE

RIGHT

RLIKE_FILTER

RPAD

RTRIM

SPLIT

STRPOS

SUBSTR

SUBSTRB

SUBSTRING

SUBSTRING_INDEX

TO_BASE64

TRANSLATE

TREAT

TRIM

UNISTR

UPPER

# 数学函数(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

ROWIDTOCHAR

SCN_TO_TIMESTAMP

TIMESTMAP_TO_SCN

TO_CHAR

TO_DATE

TO_DSINTERVAL

TO_NUMBER

TO_TIMESTAMP

TO_YMINTERVAL

# 窗口函数(Window Function)

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

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

window_function
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表示以当前行的前一行作为开始行和后一行作为结束行,窗口函数基于此范围执行分析统计。

在windowing_clause中,使用ROWS关键字时,存在如下限制:(列表示结束行;行表示开始行;√表示支持语法,×表示不支持语法)

UNBOUNDED PRECEDING UNBOUNDED FOLLOWING CURRENT ROW value_expr PRECEDING value_expr FOLLOWING
UNBOUNDED PRECEDING ×
UNBOUNDED FOLLOWING × × × × ×
CURRENT ROW × ×
value_expr PRECEDING ×
value_expr FOLLOWING × × ×

在windowing_clause中,使用RANGE关键字时,存在如下限制:

  • 如果开始行是CURRENT ROW,则结束行只允许CURRENT ROW或value_expr/UNBOUNDED FOLLOWING。
  • 如果开始行是value_expr FOLLOWING,则结束行只允许expr/UNBOUNDED FOLLOWING。
  • 窗口内ORDER BY的排序键存在多个时,开始行和结束行的表达式只能使用CURRENT ROW、UNBOUNDED PRECEDING或UNBOUNDED FOLLOWING。

使用窗口函数时须遵循如下限制:

  • 窗口函数不能被嵌套,即不能使用窗口函数作为窗口函数的参数。
  • 窗口函数一般应用于SELECT语句中的select_list,或ORDER BY语句中。

YashanDB提供如下专用窗口函数:

DENSE_RANK

FIRST_VALUE

LAG

LAST_VALUE

LEAD

RANK

ROW_NUMBER

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

AVG

COUNT

LISTAGG

MAX

MEDIAN

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

# 地理信息处理函数(GIS Function)

地理信息处理函数是指对空间地理信息进行处理的一系列函数,仅支持在单机HEAP表中使用,更多详情请查阅GIS Function

# 安全函数(Security Function)

安全函数指的是提供创建安全随机数、创建密钥、签名验签、加解密以及行访问控制相关功能的一类函数。

YashanDB提供如下安全函数:

CHAR_TO_LABEL

CRYPT_HASH

CRYPT_HMAC

CRYPT_KEY

CRYPT_RANDOM

CRYPT_SIGN

CRYPT_VERIFY

ENCRYPT_AES128

DECRYPT_AES128

CRYPT_ASYM_ENCRYPT

CRYPT_ASYM_DECRYPT

CRYPT_ENCRYPT

CRYPT_DECRYPT

CRYPT_SELFTEST

LABEL_TO_CHAR

SECURITY_CLEAR_CSP

SECURITY_MOD_STATUS

SECURITY_MOD_VERSION

# 其他函数(Other Function)

COALESCE

CHECK_SYS_PRIVILEGE

DECODE

EMPTY_BLOB

EMPTY_CLOB

GET_TYPE_NAME

GREATEST

IF

IFNULL

ISNULL

JSON

JSON_ARRAY_GET

JSON_ARRAY_LENGTH

JSON_EXISTS

JSON_QUERY

JSON_SERIALIZE

LAST_INSERT_ID

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

SOUNDEX