8. 函数
函数类似于运算符,因为它们操作数据项并返回结果。函数在参数格式上与运算符不同。这种格式使它们能够对零个、一个、两个或多个参数进行操作:
函数(参数,参数,...) 没有任何参数的函数类似于伪列。但是,伪列通常为结果集中的每一行返回不同的值,而没有任何参数的函数通常为每一行返回相同的值。 本章包含以下部分:
8.1. 关于SQL函数
SQL 函数内置于 KingBase 数据库中,可用于各种适当的 SQL 语句。不要将 SQL 函数与用 PL/SQL 编写的用户定义函数混淆。
如果调用 SQL 函数的参数的数据类型与 SQL 函数预期的数据类型不同,那么 KingBase 会在执行 SQL 函数之前尝试将参数转换为预期的数据类型。
SQL 函数中的空值
大多数标量函数在给定 null 参数时返回 null。您可以使用该NVL函数在发生 null 时返回一个值。例如,如果为空,则表达式NVL(commission_pct,0)返回 0,如果commission_pct不为空,则返回 的值commission_pct。
有关聚合函数如何处理空值的信息,请参阅聚合函数。
SQL 函数的语法
在 SQL 函数的语法图中,参数由它们的数据类型表示。当参数function出现在 SQL 语法中时,将其替换为本节中描述的函数之一。函数按其参数和返回值的数据类型分组。
将 SQL 函数应用于 LOB 列时,KingBase 数据库会在 SQL 和 PL/SQL 处理期间创建临时 LOB。您应该确保临时表空间配额足以为您的应用程序存储这些临时 LOB。
SQL 函数可能对排序规则敏感,这意味着它执行的字符值比较或匹配由排序规则控制。函数使用的特定排序规则由函数参数的排序规则确定。
如果 SQL 函数的结果具有字符数据类型,则排序规则派生规则定义排序规则以与结果关联。
以下内容对Kingbases数据库中的函数按照其用途进行分类,然后对每个函数的用法、功能、使用示例进行说明。
8.2. 数学函数
下表显示KingbaseES了可用的数学函数。在该表中,
dp
表示double precision
。这些函数中有许多都有多种不同的形式,区别是参数不同。除非特别指明,任何特定形式的函数都返回和它的参数相同的数据类型。 处理double precision
数据的函数大多数是在宿主系统的 C 库基础上实现的;因此,边界情况下的准确度和行为是根据宿主系统而变化的。用于产生随机数的函数。
下表显示了可用的三角函数。 所有三角函数都有类型为
double precision
的参数和返回类型。每一种三角函数都有两个变体,一个以弧度度量角,另一个以角度度量角。下表显示可用的双曲函数。 所有这些函数的参数和返回值的类型都是
double precision
。
8.3. 字符串函数
本节描述了用于检查和操作字符串值的函数。在这个环境中的串包括所有类型
character
、character varying
和text
的值。除非另外说明,所有下面列出的函数都可以处理这些类型,不过要小心的是,在使用character
类型的时候,它有自动填充空白的潜在影响。有些函数还可以处理位串类型。SQL定义了一些字符串函数,它们使用关键字,而不是逗号来分隔参数。详情请见下表,KingbaseES也提供了这些函数使用正常函数调用语法的版本。
注意
由于存在从那些数据类型到
text
的隐式强制措施,在KingbaseES V8.3 之前,这些函数也可以接受多种非字符串数据类型。这些强制措施在目前的版本中已经被删除,因为它们常常导致令人惊讶的行为。不过,字符串串接操作符(||
)仍然接受非字符串输入,只要至少一个输入是一种字符串类型,如下表所示。对于其他情况,如果你需要复制之前的行为,可以为text
插入一个显式强制措施。对于||
操作符,支持两个字符之间输入若干空格或者换行的字符,效果和不加空格或换行一致。
8.4. 二进制串函数
本节描述那些检查和操作类型为bytea
的值的函数。
SQL定义了一些使用关键字而不是逗号来分割参数的串函数。详情请见下表。KingbaseES也提供了这些函数使用常规函数调用语法的版本。
注意
本页中显示的示例结果假设服务器参数 bytea_output 被设置为escape
(传统KingbaseES格式)。
8.5. 模式匹配函数
本节描述了KingbaseES 支持 POSIX正则表达式模式匹配的函数。
8.6. 数据类型格式化函数
KingbaseES格式化函数提供一套强大的工具用于把各种数据类型(日期/时间、整数、浮点、数字)转换成格式化的字符串以及反过来从格式化的字符串转换成指定的数据类型。下表列出了这些函数。这些函数都遵循一个公共的调用规范:第一个参数是待格式化的值,而第二个是一个定义输出或输入格式的模板。
8.7. 时间日期函数
下表展示了可用于处理日期/时间值的函数,其细节在随后的小节中描述。并演示了基本算术操作符 (
+
、*
等)的行为。 而与格式化相关的函数,可以参考 数据类型格式化函数 。你应该很熟悉 日期时间类型 中的日期/时间数据类型的背景知识。所有下文描述的接受
time
或timestamp
输入的函数和操作符实际上都有两种变体: 一种接收time with time zone
或timestamp with time zone
, 另外一种接受time without time zone
或者timestamp without time zone
。为了简化,这些变种没有被独立地展示。此外,+
和*
操作符都是可交换的操作符对(例如,date + integer 和 integer + date);我们只显示其中一个。
8.8. 枚举支持函数
对于枚举类型有一些函数允许更清洁的编码,而不需要为一个枚举类型硬写特定的值。它们被列在下表 中。
8.9. 几何函数
几何类型
point
、box
、lseg
、line
、path
、polygon
和circle
有一大堆本地支持函数,如下列表所示。
8.10. 网络地址函数
下表展示了所有可以用于
cidr
和inet
类型的函数。函数abbrev
、host
主要是为了提供可选的显示格式用的。
8.11. XML函数
本节中描述的函数以及类函数的表达式都在类型
xml
的值上操作。用于在值和 类型
xml
之间转换的类函数的表达式xmlparse
和xmlserialize
不在这里重复介绍。
8.12. JSON函数
本节描述用于处理和创建JSON数据的函数。
8.13. 序列操作函数
本节描述用于操作 序列对象 的函数,序列对象也被称为序列生成器或者就是序列。序列对象通常用于为表的行生成唯一的标识符。下表中列出的这些序列函数,可以为我们从序列对象中获取连续的序列值提供了简单的、多用户安全的方法。
8.14. 数组函数
下表展示了可以用于数组类型的函数。
8.15. 范围函数
下表显示可用于范围类型的函数
8.16. 聚集函数
聚集函数 从一个输入值的集合计算出一个单一值。在SELECT语句中支持聚集函数嵌套调用,SELECT列表中仅支持一层聚集函数嵌套,查询语句中必须包含GROUP BY子句。
8.17. 窗口函数
窗口函数提供在与当前查询行相关的行集合上执行计算的能力。
下表列出了内建的窗口函数。注意必须使用窗口函数的语法调用这些函数; 一个
OVER
子句是必需的。在这些函数之外,任何内建的或者用户定义的通用或者统计性聚集(即非有序集和假想集聚集)都可以被用作一个窗口函数,内建聚集的列表请见 聚集函数 。仅当聚集函数调用后面跟着一个
OVER
子句时,聚集函数才会像窗口函数那样工作,否则它们会按非窗口聚集的方式运行并且为整个集合返回一个单一行。
8.18. 集合返回函数
本节描述那些可能返回多于一行的函数。目前这个类中被使用最广泛的是级数生成函数。其他更特殊的集合返回函数在本手册的其他地方描述。
8.19. 系统信息函数
下表展示了多个可以抽取会话和系统信息的函数。
除了本节列出的函数,还有一些与统计系统相关的函数也提供系统信息。
HAS_FOREIGN_DATA_WRAPPER_PRIVILEGE
SYS_GET_FUNCTION_IDENTITY_ARGUMENTS
8.20. 系统管理函数
这一节描述的函数被用来控制和监视一个KingbaseES安装。包括配置设定函数、服务器信号函数、备份控制函数、恢复控制函数、数据库对象管理函数、索引维护函数、通用文件访问函数等。参见下表: