Sql Oracle将多个列与逗号分隔的项合并到行。其中,所有列中的第一个元素应转到第一行、第二行到第二行等

Sql Oracle将多个列与逗号分隔的项合并到行。其中,所有列中的第一个元素应转到第一行、第二行到第二行等,sql,oracle,regexp-substr,Sql,Oracle,Regexp Substr,我在多列中有逗号分隔的数据 像这样: id c1 c2 100 A,B 1,2 101 C,D 3 102 E 4,5 我需要得到的是: id c1 c2 100 A 1 100 B 2 101 C 3 101 D 102 E 4 102 5 任何帮助都将不胜感激 诀窍是找出当前行中哪列的分隔符最多,并向其中添加一个分隔符,这就是需要循环的次数 通过“连接方式”。connect by随附的level变量包含计数。因此,union对当前行上的分隔符进行计数,MAX得到最大的数字,然后connect

我在多列中有逗号分隔的数据

像这样:

id c1 c2 100 A,B 1,2 101 C,D 3 102 E 4,5

我需要得到的是:

id c1 c2 100 A 1 100 B 2 101 C 3 101 D 102 E 4 102 5


任何帮助都将不胜感激

诀窍是找出当前行中哪列的分隔符最多,并向其中添加一个分隔符,这就是需要循环的次数 通过“连接方式”。connect by随附的level变量包含计数。因此,union对当前行上的分隔符进行计数,MAX得到最大的数字,然后connect by循环多次。注意,这种形式的正则表达式处理空列表元素,而用于解析字符串的更常见形式“[^,]*”则不处理空列表元素。请参阅此处以了解有关以下内容的更多信息:


欢迎来到SO。请阅读和阅读。所以这不是免费的编码服务。你试过什么?老程序员-我试过在这个论坛和其他论坛上能找到的任何东西。交叉连接表CAST MULTISET SELECT REGEXP_SUBSTR CONNECT BY LEVEL和SELECT trimregexp_substrc1'[^,]+',1,LEVEL result FROM dual CONNECT BY instrc1',',,1,LEVEL-1>0。我不确定我该怎么做才能得到答案。
-- This CTE sets up the data with variable list elements
with tbl (id, c1, c2) as (
  select 100, 'A,B', '1,2'      from dual union all
  select 101, 'C,D', '3'        from dual union all
  select 102, 'E',   '4,5'      from dual union all
  select 103, NULL, '7,8,9'     from dual union all
  select 104, 'F,G,,I,J', '10,11,12,13,14' from dual -- NULL list element
)
select id, 
       -- Don't use '[^,]*' it doesn't handle NULL list elements
       regexp_substr(c1, '(.*?)(,|$)', 1, level, NULL, 1) part1,
       regexp_substr(c2, '(.*?)(,|$)', 1, level, NULL, 1) part2
from tbl a
connect by level <= (select max(count)+1
                     from (select regexp_count(c1, ',') as count from tbl b where a.id = b.id union
                           select regexp_count(c2, ',') as count from tbl b where a.id = b.id )
                    )
and prior id = id
and prior sys_guid() is not null; 

    ID PART1    PART2         
------ -------- --------------
   100 A        1             
   100 B        2             
   101 C        3             
   101 D                      
   102 E        4             
   102          5             
   103          7             
   103          8             
   103          9             
   104 F        10            
   104 G        11            
   104          12            
   104 I        13            
   104 J        14            

14 rows selected.