SinoDB自定义聚集函数实现group_concat

如何自定义聚集函数,本文以 strsum 函数举例。

功能说明:

strsum 函数的功能:使用 ‘-’ 连接符号将多个字符连接在一起。

举例:

create table test_str(t1 integer,t2 varchar(255));

test_str 的数据如下

insert into test_str values (1,‘A’);

insert into test_str values (1,‘B’);

insert into test_str values (1,‘C’);

insert into test_str values (2,‘A’);

insert into test_str values (2,‘B’);

insert into test_str values (3,‘A’);

insert into test_str values (4,‘A’);

select t1,strsum(t2) t2_sum from test_str

where 1=1

group by t1 order by t1;

--------------------------------------------------------------------

t1 t2_sum

1 A-B-C-

2 A-B-

3 A-

4 A-

-------------------------------------------------------------------------------

若需要去掉最后一个*‘-’* 字符,只需要修改为如下SQL

select t1,rtrim(strsum(t2),‘-’) t2_sum from test_str

where 1=1

group by t1 order by t1;

--------------------------------------------------------------------------------------

t1 t2_sum

1 A-B-C

2 A-B

3 A

4 A

---------------------------------------------------------------------------------------------

在某些情况,我们需要采用不同的连接符,我们只需要修改查询SQL 语句,采用replace 函数替换*‘-’* 符号。

select t1,replace(rtrim(strsum(t2),‘-’),‘-’,‘||’) t2_sum from test_str

where 1=1

group by t1 order by t1;

t1 t2_sum

1 A||B||C

2 A||B

3 A

4 A

------------------------------------------------------------------------------------

如何定义聚集函数

如下我们将说明如何自定义该聚集函数strsum

首先定义聚集函数的4 个子函数str_sum_init,str_sum_iter,str_sum_combine,str_sum_final; 其中str_sum_iter 中定义了聚集算法为:采用*‘-’* 连接。

最后定义聚集函数strsum

代码详细见如下:

-----------------------------------------------------------------------------------------------

CREATE FUNCTION str_sum_init (dummy lvarchar(4000))

RETURNING lvarchar(4000);

RETURN ‘’;

END FUNCTION;

CREATE FUNCTION str_sum_iter (result lvarchar(4000), value lvarchar(4000))

RETURNING lvarchar(4000);

RETURN result || value ||‘-’;

END FUNCTION;

CREATE FUNCTION str_sum_combine(partial1 lvarchar(4000), partial2 lvarchar(4000))

RETURNING lvarchar(4000);

RETURN partial1 || partial2;

END FUNCTION;

CREATE FUNCTION str_sum_final(final lvarchar(4000))

RETURNING lvarchar(4000);

RETURN final;

END FUNCTION;

CREATE AGGREGATE strsum WITH

(INIT = str_sum_init,

ITER = str_sum_iter,

COMBINE = str_sum_combine,

FINAL = str_sum_final);