2017-03-06 33 views
1

我有這樣的數據,的Oracle SQL - 如何將逗號分割限制的行

ID  RPT_NAME CSV_STRING 
------------------------------ 
abc123 Test1 AA,BB,AC,AD,EF,GG,FG,FD,DF,GG,AA,PL,KI,LO,TT,TE,LF,FG 
abc456 Test2 GF,DS,SA,RE,EW,QQ,QW 
def123 Test3 HH 

我希望限制逗號分割的行爲固定數量的逗號。帖子說,我想借此下一組記錄,直到所有的記錄都行被推成組的6

對於例如,我的偏移量爲5逗號, 我試圖得到這樣的輸出這,

ID  RPT_NAME CSV_STRING 
---------------------- 
abc123 Test1 AA,BB,AC,AD,EF,GG 
abc123 Test1 GG,FG,FD,DF,GG,AA 
abc123 Test1 PL,KI,LO,TT,TE,LF 
abc123 Test1 FG 
abc456 Test2 GF,DS,SA,RE,EW,QQ 
abc456 Test2 QW 
def123 Test3 HH 

我盡我所能解釋它。 :)

請問我可以得到一個解決方案嗎? TIA讚賞

+0

您正在使用哪個版本的Oracle? – GurV

回答

0
with tab(ID,RPT_NAME,CSV_STRING) as 
(
select 'abc123','Test1','AA,BB,AC,AD,EF,GG,FG,FD,DF,GG,AA,PL,KI,LO,TT,TE,LF,FG' from DUAL 
    union all 
select 'abc456','Test2','GF,DS,SA,RE,EW,QQ,QW' from DUAL 
    union all 
select 'def123','Test3','HH' from DUAL 
) 


select id,rpt_name, 
     trim(trailing ',' from regexp_substr(csv_string,'([^,]+(,|$)){1,6}',1,level)) 
    from tab 
connect by regexp_substr(csv_string,'([^,]+(,|$)){1,6}',1,level) is not null 
    and prior id=id and prior dbms_random.value is not null 

regexp_substr用正則表達式([^,]+(,|$)){1,6}獲得一到六個元素。 connect by重現行直到字符串完成。

+0

你是最棒的! :) 完美工作。這個答案是我的問題。 – AniruddhaK

+0

考慮這是我的另一個評論, 有一件事是我的最終失敗的是, 我有一個需要添加另一個選擇頂部用相同的邏輯,但另一列,這就是它失敗因爲,Clob正在在Oracle不允許的組中使用。 有什麼建議嗎? – AniruddhaK

+0

@ AniruddhaK clob大?可能會將其轉換爲查詢 – Mike