
# 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参数的函数，调用时可省略该参数
- 函数体内可引用已声明的会话变量
 
