【问题】
有个表是这样:
COL1 COL 2 a,b,c,d h
想要变成
COL1 COL2 a h b h c h d h
该怎么办?越简便越好
【回答】
Oracle 中可以使用层次查询语句结合子查询或随机数完成,这里给出两种写法:
写法 1:
SELECT col1,REGEXP_SUBSTR(col1,'\[^,\]+',1,rn) col12,col2 FROM t0052, (SELECT LEVEL rn FROM DUAL CONNECT BY LEVEL<=(SELECT MAX(length(trim(translate(col1,replace(col1,','),' '))))+1 FROM t0052)) WHERE REGEXP_SUBSTR(col1,'\[^,\]+',1,rn) IS NOT NULL
写法 2:
select regexp_substr(col1,'\[^,\]+',1,level) col1,col2 from t0052 connect by level <= (length(col1)-length(regexp_replace(col1,'\[^,\]+',''))) and rowid= prior rowid and prior dbms_random.value is not null;
这两种写法都比较复杂,其中使用了 Oracle 的一些技巧(如为了避免循环错误使用的 prior dbms_random.value is not null),对于使用者有一定难度。
这种情况还可以用 SPL 来做,脚本如下:
| A | |
| 1 | $SELECT COL1,COL2 FROM t0052 |
| 2 | =A1.news(COL1.array();~:COL1,COL2) |
这个脚本要简单且易理解得多,其中 A2 即所得结果集:

集算器提供 JDBC 接口,可以像数据库一样嵌入到应用程序中,用起来很简单,详细可参考【Java 如何调用 SPL 脚本】。
本文介绍了如何在Oracle数据库中将含有逗号分隔值的列转换为多行记录。提供了两种Oracle查询方法,虽然包含了一些高级特性,可能对普通用户来说较为复杂。此外,还提到了使用SPL脚本的简便解决方案,该脚本易于理解和执行。
686

被折叠的 条评论
为什么被折叠?



