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

Como dividir dados consultados por delimitador no Oracle?


Você pode fazer isso usando uma cláusula de fatoração de subconsulta recursiva e funções de string simples (em vez de expressões regulares lentas).

(Observação:isso também não tem os problemas que as consultas hierárquicas têm quando há várias linhas de entrada gerando exponencialmente mais linhas de saída em cada profundidade, pois não pode correlacionar cada linha com seu pai, portanto, correlacionará com todas as linhas em o nível de hierarquia anterior.)

Configuração do Oracle :
CREATE TABLE some_table( some_id, value ) AS
  SELECT 8, 'A1,A2,A3;A4,A5,A6' FROM DUAL UNION ALL
  SELECT 8, 'B1,B2,B3;B4,B5,B6' FROM DUAL UNION ALL
  SELECT 8, 'C1,C2,C3;C4,C5,C6' FROM DUAL;

Consulta :
WITH line_start_end ( some_id, value, startidx, endidx ) AS (
  SELECT some_id,
         value,
         1,
         INSTR( value, ';', 1 )
  FROM   some_table
  WHERE  some_id = 8
UNION ALL
  SELECT some_id,
         value,
         endidx + 1,
         INSTR( value, ';', endidx + 1 )
  FROM   line_start_end
  WHERE  endidx > 0
)
SELECT some_id,
       CASE
       WHEN endidx = 0
       THEN SUBSTR( value, startidx )
       ELSE SUBSTR( value, startidx, endidx - startidx )
       END AS value
FROM   line_start_end;

Saída :

db<>fiddle aqui