Cela devrait faire l'affaire :
SELECT DISTINCT ID, regexp_substr("Strings", '[^ ]+', 1, LEVEL)
FROM T
CONNECT BY regexp_substr("Strings", '[^ ]+', 1, LEVEL) IS NOT NULL
ORDER BY ID;
Remarquez comment j'ai utilisé regexp_substr
dans la clause connect by également. C'est pour traiter le cas d'espaces multiples.
Si vous avez une limite supérieure prévisible sur le nombre d'éléments par ligne, il peut être intéressant de comparer les performances de la requête récursive ci-dessus avec un simple 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;
Voir http://sqlfiddle.com/#!4/444e3/1 pour une démonstration en direct