To powinno wystarczyć:
SELECT DISTINCT ID, regexp_substr("Strings", '[^ ]+', 1, LEVEL)
FROM T
CONNECT BY regexp_substr("Strings", '[^ ]+', 1, LEVEL) IS NOT NULL
ORDER BY ID;
Zwróć uwagę, jak użyłem regexp_substr
również w klauzuli connect by. Ma to na celu rozwiązanie przypadku wielu spacji.
Jeśli masz przewidywalną górną granicę liczby elementów w wierszu, warto porównać wydajność powyższego zapytania rekurencyjnego z prostym 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;
Zobacz http://sqlfiddle.com/#!4/444e3/1 demonstrację na żywo