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

¿Cómo dividir los datos consultados por delimitador en Oracle?

Puede hacerlo utilizando una cláusula recursiva de factorización de subconsulta y funciones de cadena simples (en lugar de expresiones regulares lentas).

(Nota:esto tampoco tiene los problemas que tienen las consultas jerárquicas cuando hay varias filas de entrada que generan exponencialmente más filas de salida en cada profundidad, ya que no puede correlacionar cada fila con su padre, por lo que la correlacionará con todas las filas en el nivel de jerarquía anterior).

Configuración de 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;

Salida :

db<>fiddle aquí