SQL实现列转行:将表abc中逗号分隔值拆分为多行
Oracle拆分逗号分隔字段为多行记录
给定你的表结构和数据:
create table abc ( column_a varchar2(100), column_b varchar2(100) ); insert into abc values ('a', 'b,c,d,e'); commit;
可以用以下两种方法实现将column_b的逗号分隔值拆分为多行,同时保留column_a的对应值:
方法1:使用CONNECT BY + 正则函数
适用于所有支持正则表达式的Oracle版本:
SELECT column_a, REGEXP_SUBSTR(column_b, '[^,]+', 1, LEVEL) AS column_b FROM abc CONNECT BY LEVEL <= REGEXP_COUNT(column_b, '[^,]+') AND PRIOR column_a = column_a AND PRIOR SYS_GUID() IS NOT NULL;
REGEXP_COUNT统计column_b中逗号分隔的元素数量,确定需要生成的行数REGEXP_SUBSTR按位置提取每个分隔后的元素PRIOR SYS_GUID() IS NOT NULL用于避免多数据行时出现循环连接问题
方法2:使用XMLTABLE(Oracle 11gR2+)
语法更简洁,适合高版本Oracle:
SELECT a.column_a, b.column_b FROM abc a, XMLTABLE( 'for $i in tokenize(., ",") return $i' PASSING a.column_b COLUMNS column_b VARCHAR2(100) PATH '.' ) b;
tokenize函数将字符串按逗号拆分XMLTABLE将拆分后的结果转换为行集,与原表关联得到最终结果
内容的提问来源于stack exchange,提问作者TSB
相关产品推荐
相关产品推荐

