Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wie werden abgefragte Daten nach Trennzeichen in Oracle aufgeteilt?

Sie können dies mit einer rekursiven Unterabfragefaktorisierungsklausel und einfachen Zeichenfolgenfunktionen (statt langsamen regulären Ausdrücken) tun.

(Hinweis:Dies hat auch nicht die Probleme, die hierarchische Abfragen haben, wenn mehrere Eingabezeilen davon exponentiell mehr Ausgabezeilen in jeder Tiefe generieren, da es nicht jede Zeile mit ihrem übergeordneten Element korrelieren kann, also wird es sie mit allen Zeilen bei korrelieren der vorherigen Hierarchieebene.)

Oracle-Setup :

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;

Abfrage :

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;

Ausgabe :

db<>fiddle hier