Questo dovrebbe fare il trucco:
SELECT DISTINCT ID, regexp_substr("Strings", '[^ ]+', 1, LEVEL)
FROM T
CONNECT BY regexp_substr("Strings", '[^ ]+', 1, LEVEL) IS NOT NULL
ORDER BY ID;
Nota come ho usato regexp_substr
anche nella clausola connect by. Questo per affrontare il caso di più spazi.
Se hai un limite superiore prevedibile sul numero di elementi per riga, potrebbe valere la pena confrontare le prestazioni della query ricorsiva sopra con un semplice 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;
Vedi http://sqlfiddle.com/#!4/444e3/1 per una demo dal vivo