跳到主要内容

别名函数

别名函数(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;

参数要求

别名函数的参数当前需满足以下两点:

  • 不支持变长参数;
  • 至少包含一个参数。