Toto může být vylepšený způsob (také s regulárním výrazem a připojením pomocí):
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
UPRAVIT :Zde je jednoduché (jako v „ne do hloubky“) vysvětlení dotazu.
length (regexp_replace(t.error, '[^,]+')) + 1
používáregexp_replace
smazat vše, co není oddělovač (v tomto případě čárka) alength +1
zjistit, kolik prvků (chyb) je tam.-
select level from dual connect by level <= (...)
používá hierarchický dotaz pro vytvoření sloupce s rostoucím počtem nalezených shod, od 1 do celkového počtu chyb.Náhled:
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))
dělá nějaké casting věšteckých typů.cast(multiset(.....)) as sys.OdciNumberList
transformuje více kolekcí (jedna kolekce pro každý řádek v původní sadě dat) do jediné kolekce čísel, OdciNumberList.table()
funkce transformuje kolekci na sadu výsledků.
-
FROM
bez spojení vytvoří křížové spojení mezi vaší datovou množinou a vícenásobnou množinou. V důsledku toho se řádek v sadě dat se 4 shodami bude opakovat 4krát (s rostoucím číslem ve sloupci s názvem „hodnota_sloupce“).Náhled:
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))
používácolumn_value
jako n-tý_vzhled/výskyt parametr proregexp_substr
.- Můžete přidat některé další sloupce ze souboru dat (
t.name, t.project
jako příklad) pro snadnou vizualizaci.
Některé odkazy na dokumenty Oracle:
- REGEXP_REPLACE
- REGEXP_SUBSTR
- Konstanty, typy a mapování rozšiřitelnosti (OdciNumberList)
- CAST (multiset)
- Hierarchické dotazy