SELECT REGEXP_SUBSTR('aa,bbb,cccc', '[^,]+', 1, rownum)
創(chuàng)新互聯(lián)公司致力于互聯(lián)網(wǎng)品牌建設(shè)與網(wǎng)絡(luò)營銷,包括成都網(wǎng)站建設(shè)、網(wǎng)站制作、SEO優(yōu)化、網(wǎng)絡(luò)推廣、整站優(yōu)化營銷策劃推廣、電子商務(wù)、移動互聯(lián)網(wǎng)營銷等。創(chuàng)新互聯(lián)公司為不同類型的客戶提供良好的互聯(lián)網(wǎng)應(yīng)用定制及解決方案,創(chuàng)新互聯(lián)公司核心團隊十余年專注互聯(lián)網(wǎng)開發(fā),積累了豐富的網(wǎng)站經(jīng)驗,為廣大企業(yè)客戶提供一站式企業(yè)網(wǎng)站建設(shè)服務(wù),在網(wǎng)站建設(shè)行業(yè)內(nèi)樹立了良好口碑。
from dual?
connect by level = LENGTH(regexp_replace('aa,bbb,cccc', '[^,]+', ''));
with baseData as(
select '1' id,'aaa' name from dual
union all
select '2' ,'bbb' from dual
)
SELECT listagg(name?,',') WITHIN GROUP (ORDER BY id)
FROM? baseData?;
? 本文記錄一下Oracle列轉(zhuǎn)行函數(shù)在Oracle11的一些不兼容問題,vm_concat在一些業(yè)務(wù)場景是必須的。不過這個函數(shù)使用要謹慎,底層實現(xiàn)應(yīng)該也是group by等等實現(xiàn)的,性能并不是特別好。這個函數(shù)在Oracle12C是沒有的,在Oracle11是不太兼容的,Oracle10可以正常使用。最近開發(fā)場景遇到這個問題,可以寫到了自定義列轉(zhuǎn)行函數(shù)的辦法去解決。但是這種辦法并不一定適用所有的業(yè)務(wù)場景。
解決方案
? ? 通過自定義函數(shù)解決也是可以的,不過我并不是這樣做的。 下面介紹一下我的解決方法。首先分析一下,Oracle19C不兼容vm_concat列轉(zhuǎn)行函數(shù),并不代表其它函數(shù)不兼容,或許可以找到其它代替的,通過找資料,發(fā)現(xiàn)了Oracle11提供的另外一個函數(shù):listagg()函數(shù) 語法:listagg(參數(shù),‘分隔符’) within group(order by 參數(shù)id),驗證可以實現(xiàn)在19C正常使用
例如:
to_char(wm_concat(t.busi_id))
可以改寫成:
to_char(listagg(t.busi_id,',' ) within GROUP (order by (t.busi_id)))
SQL如:
SELECT listagg(t.busi_id, ',') within GROUP(order by (t.busi_id))
FROM sys_cdc_sync_record t
WHERE cdc_sql_type = 'INSERT_SELECT'
可以使用wm_concat()函數(shù);
下面是我做的一個例子,可以參考下,當(dāng)然具體語法可以百度,也可以去官方文檔查:
SCOTT@ ysdb1show user
USER is "SCOTT"
SCOTT@ ysdb1create table test_concat(id number(5),name varchar2(10));
Table created.
SCOTT@ ysdb1insert into test_concat values(1,'a');
1 row created.
SCOTT@ ysdb1insert into test_concat values(1,'b');
1 row created.
SCOTT@ ysdb1insert into test_concat values(1,'c');
1 row created.
SCOTT@ ysdb1insert into test_concat values(2,'q');
1 row created.
SCOTT@ ysdb1insert into test_concat values(2,'w');
1 row created.
SCOTT@ ysdb1insert into test_concat values(2,'e');
1 row created.
SCOTT@ ysdb1insert into test_concat values(2,'f');
1 row created.
SCOTT@ ysdb1select * from test_concat;
ID NAME
---------- ----------
1 a
1 b
1 c
2 q
2 w
2 e
2 f
7 rows selected.
SCOTT@ ysdb1select wm_concat(name) from test_concat;
WM_CONCAT(NAME)
--------------------------------------------------------------------------------
a,b,c,q,w,e,f
SCOTT@ ysdb1select id,wm_concat(name) from test_concat group by id;
ID WM_CONCAT(NAME)
---------- --------------------------------------------------------------------------------
1 a,c,b
2 q,f,e,w