Dit kan een verbeterde manier zijn (ook met regexp en 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
BEWERKEN :Hier is een eenvoudige (zoals in, "niet diepgaand") uitleg van de vraag.
length (regexp_replace(t.error, '[^,]+')) + 1
gebruiktregexp_replace
om alles te wissen dat niet het scheidingsteken is (komma in dit geval) enlength +1
om te zien hoeveel elementen (fouten) er zijn.-
Het
select level from dual connect by level <= (...)
gebruikt een hiërarchische zoekopdracht om een kolom te maken met een toenemend aantal gevonden overeenkomsten, van 1 tot het totale aantal fouten.Voorbeeld:
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))
doet wat casting van orakeltypes.- De
cast(multiset(.....)) as sys.OdciNumberList
transformeert meerdere verzamelingen (één verzameling voor elke rij in de originele dataset) in een enkele verzameling getallen, OdciNumberList. - De
table()
functie transformeert een verzameling in een resultatenset.
- De
-
FROM
zonder een join maakt een cross join tussen uw dataset en de multiset. Als resultaat wordt een rij in de dataset met 4 overeenkomsten 4 keer herhaald (met een toenemend aantal in de kolom met de naam "column_value").Voorbeeld:
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))
gebruikt decolumn_value
als de nth_appearance/ocurrence parameter voorregexp_substr
.- U kunt enkele andere kolommen uit uw dataset toevoegen (
t.name, t.project
als voorbeeld) voor eenvoudige visualisatie.
Enkele verwijzingen naar Oracle-documenten:
- REGEXP_REPLACE
- REGEXP_SUBSTR
- Uitbreidbaarheidsconstanten, typen en toewijzingen (OdciNumberList)
- CAST (multiset)
- Hiërarchische zoekopdrachten