串字段拆分再生成记录

【问题】

有个表是这样:

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 即所得结果集:

imagepng

集算器提供 JDBC 接口,可以像数据库一样嵌入到应用程序中,用起来很简单,详细可参考【Java 如何调用 SPL 脚本】。