Das sollte funktionieren:
SELECT DISTINCT ID, regexp_substr("Strings", '[^ ]+', 1, LEVEL)
FROM T
CONNECT BY regexp_substr("Strings", '[^ ]+', 1, LEVEL) IS NOT NULL
ORDER BY ID;
Beachten Sie, wie ich regexp_substr
verwendet habe auch in der connect by-Klausel. Dies dient dem Umgang mit mehreren Leerzeichen.
Wenn Sie eine vorhersehbare Obergrenze für die Anzahl der Elemente pro Zeile haben, lohnt es sich möglicherweise, die Leistung der obigen rekursiven Abfrage mit einem einfachen CROSS JOIN
zu vergleichen :
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;
Siehe http://sqlfiddle.com/#!4/444e3/1 für eine Live-Demo