近日,需要整一个东西
表中存的是
cola clob
a 1
a 2
b 1
b 2
但是呢,需要输出成
a ( 1 / 2 ) , b ( 1 / 2 )
原始的方法呢,是把字段都查询出来,然后呢,代码里面拼接。。
但是啊,数据有点多啊,太慢,
好吧,我承认,这都不是问题,关键是,真心懒得写这么麻烦的代码
淡疼啊。。。。
所以,百度了一下,真的,是百度,不是google,
然后,找到了 listagg within group 以及WMSYS.wm_concat
但是呢,好像都不能满足的我要求啊,有点纠结
因为我是要操作两次
然后,我就把操作拆分了一下
先使用listagg ( colb , ' / ' ) within group () as colb 获取到(这里说一下,listagg是可以指定分隔符的。。。哈哈,刚好满足我的需要)
a ( 1 / 2 ) 和 b ( 1 / 2 ),这个作为子查询结果
然后呢,在外层再套上一个查询,使用WMSYS.wm_concat(cola),WMSYS.wm_concat(colb)来获取结果
当然,最后还是在了一下拼接的代码
WMSYS.wm_concat查出来的是colb类型啊。。。
使用colb.getSubString(1,(int)colb.length()),splite(",");来获取其中的内容
那么,有人这里就问我,为什么还要拼接一下啊
我想说的是,外层查询的结果是
WMSYS.wm_concat(cola) WMSYS.wm_concat ( colb )
a,b ( 1 / 2 ) , (1 / 2 )
我只要把结果里面的,分别拼接一下就OK了
不需要去拼其他的
而且
说过了数据多啊。。。
可能会有a ( 1 / 2 ) , b ( 1 / 2 )
可能是 b ( 1 / 2 )
可能是 a ( 1 / 2 )
当我查询出来的时候,不需要去判断,只需要去无脑拼接就好
因为
WMSYS.wm_concat(cola) WMSYS.wm_concat ( colb )
a,b ( 1 / 2 ) , (1 / 2 )
b (1 / 2 )
a (1 / 2 )
a,b ( 1 ) , ( 2 )
这一步的时候,所有的结果都已经出来了,不需要再去纠结
是否有a啊,a下面是否有1,有2啊
之类的脑抽问题了。
用listagg的时候就已经搞定了,是不是很happy
之前的代码,先捞出来需要数据,然后再去多层循环拼接,啊,代码看的我都眼瞎啊,实在忍不住了,抛弃重写。。。