更新时间:2026-07-03 GMT+08:00
分享

SQL自定义函数

功能描述

SQL自定义函数允许使用SQL表达式定义函数逻辑,支持标量函数(返回单个值)和表值函数(返回表结果集)。

语法格式

  • 创建标量函数
    CREATE [OR REPLACE] FUNCTION function_name ([parameter_name data_type [{ DEFAULT | = } default_value]] [, ...])
      RETURNS return_data_type
      RETURN expression;
  • 创建表值函数
    CREATE [OR REPLACE] FUNCTION function_name ([parameter_name data_type [{ DEFAULT | = } default_value]] [, ...])
      RETURNS TABLE (col_name col_type [, ...])
      RETURN query_statement;
  • 删除函数
    DROP FUNCTION [IF EXISTS] function_name; 
  • 查看函数定义
    DESCRIBE FUNCTION [EXTENDED] function_name;

关键字

  • OR REPLACE:如果函数已存在则替换。
  • RETURNS:指定返回值类型。
  • RETURN:函数体,SQL表达式或查询语句。
  • DEFAULT / =:指定参数默认值。

参数说明

参数

是否必选

描述

function_name

函数名称

parameter_name

参数名称

data_type

参数数据类型,若省略时,系统从默认值推断类型

default_value

参数默认值

return_data_type

返回值数据类型

expression

标量函数体,SQL表达式

query_statement

表值函数体,SELECT查询语句

示例

  • 创建简单标量函数
    CREATE FUNCTION hello() RETURNS STRING RETURN 'Hello World';
    
    SELECT hello();
    -- 输出: Hello World
  • 创建带参数的标量函数
    CREATE FUNCTION add_tax(price DOUBLE) RETURNS DOUBLE RETURN price * 1.13;
    
    SELECT add_tax(100.0);
    -- 输出: 113.0
  • 创建带默认参数的函数
    CREATE FUNCTION greet(name STRING DEFAULT 'World') RETURNS STRING 
      RETURN CONCAT('Hello, ', name, '!');
    
    SELECT greet();
    -- 输出: Hello, World!
    
    SELECT greet('Spark');
    -- 输出: Hello, Spark!
  • 创建表值函数
    CREATE FUNCTION range_n(n INT) 
      RETURNS TABLE (id INT, value STRING)
      RETURN SELECT id, CONCAT('val_', id) FROM EXPLODE(SEQUENCE(1, n)) AS t(id);
    
    SELECT * FROM range_n(3);
    -- 输出: (1, val_1), (2, val_2), (3, val_3)
  • 替换已有函数
    CREATE OR REPLACE FUNCTION add_tax(price DOUBLE) RETURNS DOUBLE 
      RETURN price * 1.2;
  • 删除函数
    DROP FUNCTION IF EXISTS add_tax; 

注意事项

  • SQL自定义函数在Spark 4.0中为新增功能
  • 标量函数的RETURN后跟单个SQL表达式
  • 表值函数的RETURN后跟SELECT查询语句
  • 带DEFAULT参数的函数,调用时可省略该参数
  • 函数体内可引用已声明的会话变量

相关文档