>>-CREATE AGGREGATE--+---------------+--+-----------------------+--aggregate-->
'-IF NOT EXISTS-' | (1) |
'-| Owner Name |------.-'
.-,-------------.
V |
>--WITH--(----| Modifiers |-+--)-------------------------------><
Modifiers
|--+-INIT=init_func-------+-------------------------------------|
+-ITER=iter_func-------+
+-COMBINE=comb_func----+
'-+-FINAL=final_func-+-'
'-HANDLESNULLS-----'
CREATE AGGREGATE语句需要有关四个支持函数的实现。
-
INIT
初始化计算聚合所需的数据类型 -
ITER
将单个(行)值与上一个部分结果合并 -
COMBINE
将一个部分结果与另一个部分的结果合并,从而允许并行执行 -
FINAL
将部分结果转换为最终值,执行清理操作并释放资源。
CREATE FUNCTION my_init (start varchar(32765),var1 varchar(32765) default '')
RETURNING varchar(32765);
RETURN var1||'value:';
END FUNCTION;
CREATE FUNCTION my_iter (result varchar(32765),var varchar(32765))
RETURNING varchar(32765);
define i varchar(100);
let i = SUBSTRING_INDEX(result,'value:',1);
RETURN result||i||var;
END FUNCTION;
CREATE FUNCTION my_combine(partial1 varchar(32765),partial2 varchar(32765))
RETURNING varchar(32765);
define i int;
let i = length(SUBSTRING_INDEX(partial2,'value:',1));
RETURN partial1||substr(partial2,i*2+7);
END FUNCTION;
CREATE FUNCTION my_final(final varchar(32765))
RETURNING varchar(32765)
define i int;
let i = length(SUBSTRING_INDEX(final,'value:',1));
RETURN substr(final,i*2+7);
END FUNCTION;
CREATE AGGREGATE mywmconcat WITH
(INIT = my_init,
ITER = my_iter,
COMBINE = my_combine,
FINAL = my_final);
表数据如下
create table tab1 (c1 int,c2 varchar(20));
insert into tab1 values(1,'abc');
insert into tab1 values(2,'中国字');
insert into tab1 values(3,'1234');
测试查询:
> select mywmconcat(c2) from tab1;
mywmconcat abc中国字1234
1 row(s) retrieved.
> select mywmconcat(c2,'||') from tab1;
mywmconcat abc||中国字||1234
1 row(s) retrieved.