Detta kan vara ett förbättrat sätt (även med regexp och 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
REDIGERA :Här är en enkel (som i, "inte på djupet") förklaring av frågan.
length (regexp_replace(t.error, '[^,]+')) + 1
använderregexp_replace
för att radera allt som inte är avgränsaren (komma i det här fallet) ochlength +1
för att få hur många element (fel) som finns.-
select level from dual connect by level <= (...)
använder en hierarkisk fråga för att skapa en kolumn med ett ökande antal träffar hittade, från 1 till det totala antalet fel.Förhandsgranskning:
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))
gör en del gjutning av orakeltyper.cast(multiset(.....)) as sys.OdciNumberList
omvandlar flera samlingar (en samling för varje rad i den ursprungliga datamängden) till en enda samling nummer, OdciNumberList.table()
funktion omvandlar en samling till en resultatuppsättning.
-
FROM
utan anslutning skapar en korskoppling mellan din datauppsättning och multiuppsättningen. Som ett resultat kommer en rad i datamängden med fyra matchningar att upprepas fyra gånger (med ett ökande antal i kolumnen med namnet "column_value").Förhandsgranskning:
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))
användercolumn_value
som nth_appearance/ocurrence parameter förregexp_substr
.- Du kan lägga till några andra kolumner från din datamängd (
t.name, t.project
som ett exempel) för enkel visualisering.
Några referenser till Oracle-dokument:
- REGEXP_REPLACE
- REGEXP_SUBSTR
- Utökbarhetskonstanter, typer och mappningar (OdciNumberList)
- CAST (multiset)
- Hierarkiska frågor