Oracle SQL - 如何将逗号拆分限制为行
Posted
技术标签:
【中文标题】Oracle SQL - 如何将逗号拆分限制为行【英文标题】:Oracle SQL - how to Limit the comma splitting to rows 【发布时间】:2017-03-06 18:35:26 【问题描述】:我有这样的数据,
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 赞赏
【问题讨论】:
您使用的是哪个版本的 Oracle? 【参考方案1】: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
复制行直到字符串完成。
【讨论】:
你是最棒的! :) 工作完美。这个答案是我的问题。 将此视为我的另一条评论,我最后失败的一件事是,我需要在此之上添加另一个选择,其逻辑相同但用于另一列,这就是它失败的地方因为,Clob 被分组使用,这是 Oracle 不允许的。有什么建议吗? @AniruddhaK clob 大吗?可以在查询中将其转换为 varchar (dbms_lob.substr()
)
但是长度太大了,超过了 Varchar2 失败的 4000
@AniruddhaK 有必要对零件进行加工并结合结果。或者创建一个高亮标记的存储函数以上是关于Oracle SQL - 如何将逗号拆分限制为行的主要内容,如果未能解决你的问题,请参考以下文章