Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Dividir String em linhas Oracle SQL


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