sql语句中使用拼接语句,提示字符串拼接过长的问题处理

背景:

  项目上最近被要求写一个根据日期统计数据的语句,然后找到我说他们自己写的语句报错了,让我给他们修改下,然后看了他们写的语句,不忍直视,其中里面用到了字符串的拼接,发现给他们之后,报了字符串拼接过长的错误,下面就是相应的解决过程:

 

关于字符串拼接函数,用到的基本上都是这2个:

wm_concat()和listagg(字段,',') within group by(order by ...) 函数

按照项目上的要求使用这2个函数拼接都可,但是使用习惯了listagg函数(原因是可以进行拼接排序的操作),就使用了此函数完成拼接,但是发现报错了。

简要语句如下:(子查询)

(select listagg(to_char(clmc),'、') within group(order by ax_owner) as clmc from  bdc_xxx where slid=a.slid GROUP BY slid) as clmc

关于字符串拼接过长这个问题,都知道是拼接的字段超出了长度,最大长度4000,但是按照我们的业务来说是不会超出的,检查了他们的数据库,发现是转库的数据,就会导致这个clmc字段长度特别长,通过查找资料发现了一种可直接处理的方式,如下:

(select rtrim(xmlagg(xmlelement(e,clmc,'、').extract('//text()') order by ax_owner).GetClobVal(),'、') from  bdc_xxx where slid=a.slid GROUP BY slid) as clmc

这样的话,拼接出来的这个字段就是clob字段了,就能进行下面的操作,这种方式可适用于其他项目;

但是关于他们项目的问题,个人发现了他们的数据问题其实可以处理的,因为他们的字段中会存在空格的占位符,所以可以对字段进行trim处理,如下:

(select listagg(trim(to_char(clmc)),'、') within group(order by ax_owner) as clmc from  bdc_xxx where slid=a.slid GROUP BY slid) as clmc

这样就能满足项目上的需要了;

上一篇:设计模式 - java


下一篇:Hbase shell管理操作