串字段拆分再生成记录
【问题】
有个表是这样:
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 脚本】。