问题来源:http://bbs.csdn.net/topics/390991336 。
表1(T1)中存储了单独的id和name字段,部分源数据如下:
id name
1 a
2 b
3 c
4 d
5 e
表2(T2)中存储了多个id组成的ids字段,其值如下:
ids
1,2,3
4,3
1,2,3
现在要根据T1中的id和name,将T2中的ids转化为对应的多个name组成的记录,比如上述T2转换后的结果为:
a,b,c
d,c
a,b,c
集算器实现代码如下:
A1,A2:执行SQL将T1、T2的数据取出。
A3:循环A2中的记录,将每个ids值转为序列后,与T1中的记录匹配得到name序列,而后转换为逗号分隔的记录。结果如下:
上述写法要假定id为整数且连续,如果id不连续,那么A3的写法可以改为:
A3:>A1.primary(id)
A4:=A2.(ids.array().(A1.find(~).name ).string@d())
用SQL实现这个问题需要用到子查询生成一个唯一分组号,再用较复杂的JOIN实现,以MySQL为例写成这样:
select group_concat(t1.name) names from(
select @row:=@row+1 as gid,ids from t2,(SELECT @row :=0 ) r
) t2 left join t1 on find_in_set(t1.id,t2.ids) group by t2.gid
而且,这个SQL只能用于T2的ids无重复值时,如果有重复值结果只会保留一个,比如:“2,1,2,3”算完的结果是”a,b,c”而不是”b,a,b,c”,相对来讲,集算器的语法要更直观易懂且适用面更广
集算器可被报表工具或java程序调用,调用的方法也和普通数据库相似,使用它提供的JDBC接口即可向java主程序返回ResultSet形式的计算结果,具体方法可参考相关文档。