Może to być lepszy sposób (także z regexp i 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
EDYTUJ :Oto proste (jak w „nie dogłębnym”) wyjaśnienie zapytania.
length (regexp_replace(t.error, '[^,]+')) + 1
używaregexp_replace
aby usunąć wszystko, co nie jest ogranicznikiem (w tym przypadku przecinkiem) ilength +1
aby uzyskać liczbę elementów (błędów).-
select level from dual connect by level <= (...)
używa zapytania hierarchicznego aby utworzyć kolumnę z rosnącą liczbą znalezionych dopasowań, od 1 do całkowitej liczby błędów.Podgląd:
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))
wykonuje pewne rzucanie typów wyroczni.cast(multiset(.....)) as sys.OdciNumberList
przekształca wiele kolekcji (jeden zbiór dla każdego wiersza w oryginalnym zestawie danych) w pojedynczy zbiór liczb, OdciNumberList.table()
funkcja przekształca kolekcję w zestaw wyników.
-
FROM
bez sprzężenia tworzy połączenie krzyżowe między zbiorem danych a zbiorem multiset.W rezultacie wiersz w zestawie danych z 4 dopasowaniami powtórzy się 4 razy (ze wzrastającą liczbą w kolumnie o nazwie "wartość_kolumny").Podgląd:
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))
używacolumn_value
jako nth_appearance/ocurrence parametr dlaregexp_substr
.- Możesz dodać kilka innych kolumn ze swojego zestawu danych (
t.name, t.project
jako przykład) dla łatwej wizualizacji.
Kilka odniesień do dokumentów Oracle:
- REGEXP_REPLACE
- REGEXP_SUBSTR
- Stałe, typy i mapowania rozszerzalności (OdciNumberList)
- CAST (multiset)
- Zapytania hierarchiczne