Dette burde gøre tricket:
SELECT DISTINCT ID, regexp_substr("Strings", '[^ ]+', 1, LEVEL)
FROM T
CONNECT BY regexp_substr("Strings", '[^ ]+', 1, LEVEL) IS NOT NULL
ORDER BY ID;
Bemærk, hvordan jeg brugte regexp_substr
også i connect by-klausulen. Dette er for at håndtere tilfælde af flere mellemrum.
Hvis du har en forudsigelig øvre grænse for antallet af elementer pr. linje, kan det være værd at sammenligne ydeevnen af den rekursive forespørgsel ovenfor med en simpel 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;
Se http://sqlfiddle.com/#!4/444e3/1 for en live demo