搜索论坛后,我提出了以下内容,但没有用:/

我有一张桌子,上面有;

ID |   Strings
123|   abc fgh dwd
243|   dfs dfd dfg
353|   dfs
424|   dfd dfw
523|
.
.
.

请不要说大约有20,000行,我的另一种选择是编写一个存储过程来做到这一点...基本上,我需要将字符串分割开,以便每个这样的一行
ID |  Strings
123| abc
123| fgh
123| dwd
243| dfs

等等...

这就是我所拥有的。
create table Temp AS
SELECT ID, strings
From mytable;

SELECT DISTINCT ID, trim(regexp_substr(str, '[^ ]+', 1, level)) str
FROM (SELECT ID, strings str FROM temp) t
CONNECT BY instr(str, ' ', 1, level -1) >0
ORDER BY ID;

任何帮助表示赞赏

最佳答案

这应该可以解决问题:

SELECT DISTINCT ID, regexp_substr("Strings", '[^ ]+', 1, LEVEL)
FROM T
CONNECT BY regexp_substr("Strings", '[^ ]+', 1, LEVEL) IS NOT NULL
ORDER BY ID;

请注意,我也是如何在connect by子句中使用regexp_substr的。这是为了处理多个空格的情况。

如果您对每行项目数有一个可预测的上限,则可能需要将上面的递归查询的性能与一个简单的CROSS JOIN进行比较:
WITH N as (SELECT LEVEL POS FROM DUAL CONNECT BY LEVEL < 10)
--                                                       ^^
--                                                 up to 10 substrings
SELECT ID, regexp_substr("Strings", '[^ ]+', 1, POS)
FROM T CROSS JOIN N
WHERE regexp_substr("Strings", '[^ ]+', 1, POS) IS NOT NULL
ORDER BY ID;

观看http://sqlfiddle.com/#!4/444e3/1进行现场演示

07-24 22:17