2017-03-06 67 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