SQL自定义函数如何实现类似concat()的可变参数传入功能?
实现支持多参数加法函数的可行方案
不同数据库有不同的实现方式,以下是通用的可行方案:
支持可变参数的数据库(PostgreSQL、MySQL 8.0+等)
这类数据库原生支持可变参数语法,可以直接定义符合需求的函数,示例如下(PostgreSQL写法):
CREATE FUNCTION addition(VARIADIC args numeric[]) RETURNS numeric AS $$ BEGIN RETURN sum(val) FROM unnest(args) val; END; $$ LANGUAGE plpgsql;
调用时可传入任意数量的数值参数,示例:SELECT addition(1,2,3,4,10.5);
不支持可变参数的数据库(SQL Server等)
可以用两种替代方案实现:
- 方案1:传入拼接好的数值字符串
把所有要相加的数值用逗号拼接为字符串传入,函数内部拆分后求和,示例如下:
调用示例:CREATE FUNCTION addition (@numStr VARCHAR(MAX)) RETURNS DECIMAL AS BEGIN DECLARE @result DECIMAL SELECT @result = SUM(CAST(value AS DECIMAL)) FROM STRING_SPLIT(@numStr, ',') RETURN @result ENDSELECT addition('1,2,3,4,10.5') - 方案2:定义多个可选参数
预设足够多的可选参数,默认值设为NULL,相加时自动忽略未传入的参数,示例如下:
调用时可传入2到预设上限数量的参数,示例:CREATE FUNCTION addition ( @a DECIMAL = NULL, @b DECIMAL = NULL, @c DECIMAL = NULL, @d DECIMAL = NULL, @e DECIMAL = NULL -- 可按需求扩展更多参数 ) RETURNS DECIMAL AS BEGIN RETURN ISNULL(@a,0) + ISNULL(@b,0) + ISNULL(@c,0) + ISNULL(@d,0) + ISNULL(@e,0) ENDSELECT addition(1,2,3)、SELECT addition(10,20,30,40)
内容的提问来源于stack exchange,提问作者ayush jain
相关产品推荐
相关产品推荐

