背景:
項目上最近被要求寫一個根據日期統計數據的語句,然后找到我說他們自己寫的語句報錯了,讓我給他們修改下,然后看了他們寫的語句,不忍直視,其中里面用到了字符串的拼接,發現給他們之后,報了字符串拼接過長的錯誤,下面就是相應的解決過程:
關於字符串拼接函數,用到的基本上都是這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
這樣就能滿足項目上的需要了;