Dette kan være en forbedret måde (også med regexp og 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
REDIGER :Her er en simpel (som i, "ikke i dybden") forklaring af forespørgslen.
length (regexp_replace(t.error, '[^,]+')) + 1
brugerregexp_replace
for at slette alt, der ikke er afgrænsningstegnet (komma i dette tilfælde) oglength +1
for at få, hvor mange elementer (fejl) der er.-
select level from dual connect by level <= (...)
bruger en hierarkisk forespørgsel for at oprette en kolonne med et stigende antal fundne matches fra 1 til det samlede antal fejl.Eksempel:
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))
laver nogle støbninger af orakeltyper.cast(multiset(.....)) as sys.OdciNumberList
omdanner flere samlinger (én samling for hver række i det originale datasæt) til en enkelt samling af tal, OdciNumberList.table()
funktion omdanner en samling til et resultatsæt.
-
FROM
uden en join oprettes en kryds joinforbindelse mellem dit datasæt og multisættet. Som et resultat vil en række i datasættet med 4 match gentages 4 gange (med et stigende antal i kolonnen kaldet "column_value").Eksempel:
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))
brugercolumn_value
som nth_appearance/ocurrence parameter forregexp_substr
.- Du kan tilføje nogle andre kolonner fra dit datasæt (
t.name, t.project
som et eksempel) for nem visualisering.
Nogle referencer til Oracle-dokumenter:
- REGEXP_REPLACE
- REGEXP_SUBSTR
- Udvidelseskonstanter, typer og tilknytninger (OdciNumberList)
- CAST (multiset)
- Hierarkiske forespørgsler