别名函数
别名函数(Alias Function)是指为某个函数或表达式片段注册一个新的签名,从而以另一个名字来调用它。借助别名函数,可以在迁移异构数据库的查询时屏蔽函数名差异,也可以将复杂的表达式片段封装成一个简洁的函数调用。
概念介绍
别名函数本质是为一个函数或表达式片段在系统中注册新的签名,调用别名等价于调用其指向的真实表达式。
与其他自定义函数一致,别名函数支持两种作用域:
| 作用域 | 注册范围 | 调用方式 |
|---|---|---|
LOCAL | 当前数据库 | 在其他数据库中调用需使用全限定名 <所属数据库名>.<函数名> |
GLOBAL | 全局 | 在任意数据库下都可直接通过函数名访问 |
使用场景
场景一:异构数据库迁移时为函数起别名
在系统迁移过程中,用户已有的查询可能来自其他数据库系统。这些查询中常存在与 Doris 中某个函数功能一致、但名称不同的函数。
通过为该 Doris 函数定义一个与原数据库同名的别名函数,可以在用户侧无感的情况下完成迁移,不必逐条改写 SQL。
场景二:简化复杂查询语句
在复杂分析场景中,同一个语句或不同语句中往往存在大量重复的表达式片段。
通过为这一段复杂表达式创建别名函数,可以:
- 简化查询语句的书写;
- 提升 SQL 的可读性与可维护性;
- 降低重复表达式不一致带来的维护成本。
支持范围
表达式要求
当前别名函数所指向的真实表达式,其根节点必须是函数表达式。
合法示例:
-- 创建一个名为 func,参数为 INT, INT 的别名函数,实际指向的表达式为 abs(foo + bar)
CREATE ALIAS FUNCTION func(INT, INT) WITH PARAMETER(foo, bar) AS abs(foo + bar);
-- 创建一个名为 func,参数为 DATETIMEV2(3), INT 的别名函数,实际指向的表达式为 date_trunc(days_sub(foo, bar), 'day')
CREATE ALIAS FUNCTION func(DATETIMEV2(3), INT) WITH PARAMETER (foo, bar) AS date_trunc(days_sub(foo, bar), 'day');
不合法示例:
-- 根表达式不是函数,而是算术运算符
CREATE ALIAS FUNCTION func(INT, INT) WITH PARAMETER(foo, bar) AS foo + bar;
参数要求
别名函数的参数当前需满足以下两点:
- 不支持变长参数;
- 至少包含一个参数。