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

Aufteilen einer Zeichenfolge in mehrere Zeilen in Oracle

Dies könnte ein verbesserter Weg sein (auch mit regexp und connect by):

with temp as
(
    select 108 Name, 'test' Project, 'Err1, Err2, Err3' Error  from dual
    union all
    select 109, 'test2', 'Err1' from dual
)
select distinct
  t.name, t.project,
  trim(regexp_substr(t.error, '[^,]+', 1, levels.column_value))  as error
from 
  temp t,
  table(cast(multiset(select level from dual connect by  level <= length (regexp_replace(t.error, '[^,]+'))  + 1) as sys.OdciNumberList)) levels
order by name

BEARBEITEN :Hier ist eine einfache (wie in "nicht ausführlich") Erklärung der Abfrage.

  1. length (regexp_replace(t.error, '[^,]+')) + 1 verwendet regexp_replace um alles zu löschen, was nicht das Trennzeichen (Komma in diesem Fall) und length +1 ist um zu erfahren, wie viele Elemente (Fehler) vorhanden sind.
  2. Die select level from dual connect by level <= (...) verwendet eine hierarchische Abfrage um eine Spalte mit einer steigenden Anzahl gefundener Übereinstimmungen zu erstellen, von 1 bis zur Gesamtzahl der Fehler.

    Vorschau:

    select level, length (regexp_replace('Err1, Err2, Err3', '[^,]+'))  + 1 as max 
    from dual connect by level <= length (regexp_replace('Err1, Err2, Err3', '[^,]+'))  + 1
    
  3. table(cast(multiset(.....) as sys.OdciNumberList)) führt ein Casting von Orakeltypen durch.
    • Der cast(multiset(.....)) as sys.OdciNumberList wandelt mehrere Sammlungen (eine Sammlung für jede Zeile im ursprünglichen Datensatz) in eine einzige Sammlung von Zahlen um, OdciNumberList.
    • Die table() Funktion wandelt eine Sammlung in eine Ergebnismenge um.
  4. FROM ohne Join erstellt einen Cross Join zwischen Ihrem Datensatz und dem Multiset. Als Ergebnis wird eine Zeile im Datensatz mit 4 Übereinstimmungen 4 Mal wiederholt (mit einer steigenden Zahl in der Spalte mit dem Namen „column_value“).

    Vorschau:

    select * from 
    temp t,
    table(cast(multiset(select level from dual connect by  level <= length (regexp_replace(t.error, '[^,]+'))  + 1) as sys.OdciNumberList)) levels
    
  5. trim(regexp_substr(t.error, '[^,]+', 1, levels.column_value)) verwendet den column_value als n-tes_Erscheinen/Vorkommen Parameter für regexp_substr .
  6. Sie können einige andere Spalten aus Ihrem Datensatz hinzufügen (t.name, t.project als Beispiel) zur einfachen Visualisierung.

Einige Verweise auf Oracle-Dokumente:

  • REGEXP_REPLACE
  • REGEXP_SUBSTR
  • Erweiterbarkeitskonstanten, -typen und -zuordnungen (OdciNumberList)
  • CAST (Multiset)
  • Hierarchische Abfragen