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 - 如何将逗号拆分限制为行的主要内容,如果未能解决你的问题,请参考以下文章

将字符串拆分为行 Oracle SQL

Redshift :- 易于将逗号分隔的字符串拆分为行

将逗号分隔的列条目拆分为行

如何根据一个字段是不是包含oracle sql中的逗号分隔字符串将单行拆分为多行?

oracle 如何将一个字段里的值拆分为多个值显示出来

oracle 字段比例拆分