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.
length (regexp_replace(t.error, '[^,]+')) + 1
verwendetregexp_replace
um alles zu löschen, was nicht das Trennzeichen (Komma in diesem Fall) undlength +1
ist um zu erfahren, wie viele Elemente (Fehler) vorhanden sind.-
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
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.
- Der
-
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
trim(regexp_substr(t.error, '[^,]+', 1, levels.column_value))
verwendet dencolumn_value
als n-tes_Erscheinen/Vorkommen Parameter fürregexp_substr
.- 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