Oracle 多个列,其中逗号分隔的项目为行.所有列中的第一个元素应该转到第一行,第二个到第二个等



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

喜欢这个:

 ID     C1      C2
100   A,B   1,2101   C,D   3 102   E       4,5

我需要得到的是:

 ID    C1    C2
100   安培     1100   B     2101   C     3101   天 102   东     4102          5<溴 />

任何帮助将不胜感激。

诀窍是找出当前行上哪一列的分隔符最多,并向其添加一个分隔符,这就是您需要"循环"多少次通过连接方式。连接方式附带的"level"变量包含计数。因此,联合计算当前行上的分隔符,MAX() 获得最大的数字,然后通过"循环"进行多次连接。请注意,这种形式的正则表达式处理 NULL 列表元素,其中用于解析字符串的更常见的'[^,]*'形式则不处理。有关此的更多信息,请参阅此处:https://stackoverflow.com/a/31464699/2543416。

-- 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.

相关内容

最新更新