日常工作中经常用到合并字符串的工作,现在谈谈db2数据库上可选的解决方式。
----1、搭建测试环境
--建表
create table test
(id int,
name varchar(100));
--测试数据
insert into test
values
(1,'a')
,(1,'b')
,(1,'c')
,(2,'d')
,(3,'test')
,(3,'hello');
----要求结果
1 'a,b'
2 'd'
3 'test,hello'
----2、实现方式
---方法1:自定义聚合函数法(UDF)
---sqlserver中可以使用select @a=@a+col from tab where..的方式,db2中没找到类似的处理方式,只能用游标了
---创建自定义函数
create function f_mrgstr(v_id integer)
returns varchar(8000)
BEGIN ATOMIC
declare v_name varchar(8000) default '';
for c1 as select name from test where id =v_id
do
set v_name = v_name||c1.name||',';
end for;
return substr(v_name,1,length(v_name)-1);
END;
----调用函数
select id,f_mrgstr(id) from test
group by id;
----方法2:CTE结合OLAP排序函数
with cte(id,name,rownum)
as
(
select
id
,name
,row_number() over (partition by id)
from test
),
cte1(id,name,rownum)
as
(
select id,name,rownum from cte where rownum =1
union all
select a.id,b.name||','||a.name,a.rownum+1 from cte a,cte1 b
where a.id = b.id and a.rownum = b.rownum+1
)
select a.id,a.name from cte1 a inner join
(select id,max(rownum) rownum from cte1 group by id)b
on a.id=b.id and a.rownum=b.rownum