Oracle
 sql >> Base de données >  >> RDS >> Oracle

Diviser la chaîne en lignes Oracle SQL

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