我在多列中有逗号分隔的数据。
喜欢这个:
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.