Isso deve fazer o truque:
SELECT DISTINCT ID, regexp_substr("Strings", '[^ ]+', 1, LEVEL)
FROM T
CONNECT BY regexp_substr("Strings", '[^ ]+', 1, LEVEL) IS NOT NULL
ORDER BY ID;
Observe como eu usei
regexp_substr
na cláusula connect by também. Isto é para lidar com o caso de múltiplos espaços. Se você tiver um limite superior previsível no número de itens por linha, pode valer a pena comparar o desempenho da consulta recursiva acima com um simples
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;
Veja http://sqlfiddle.com/#!4/444e3/1 para uma demonstração ao vivo