sql >> Base de Datos >  >> RDS >> Oracle

Dividir cadena en filas Oracle SQL

Esto debería funcionar:

SELECT DISTINCT ID, regexp_substr("Strings", '[^ ]+', 1, LEVEL)
FROM T
CONNECT BY regexp_substr("Strings", '[^ ]+', 1, LEVEL) IS NOT NULL
ORDER BY ID;

Observe cómo usé regexp_substr en la cláusula connect by también. Esto es para tratar el caso de múltiples espacios.

Si tiene un límite superior predecible en la cantidad de elementos por línea, podría valer la pena comparar el rendimiento de la consulta recursiva anterior con 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;

Consulte http://sqlfiddle.com/#!4/444e3/1 para ver una demostración en vivo