【问题】
有个表是这样:
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 脚本】。