搜索论坛后,我提出了以下内容,但没有用:/
我有一张桌子,上面有;
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进行现场演示