Това може да е подобрен начин (също с regexp и свързване чрез):
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
РЕДАКТИРАНЕ :Ето едно просто (като "не в дълбочина") обяснение на заявката.
length (regexp_replace(t.error, '[^,]+')) + 1
използваregexp_replace
да изтриете всичко, което не е разделител (запетая в този случай) иlength +1
за да разберете колко елемента (грешки) има.-
select level from dual connect by level <= (...)
използва йерархична заявка за да създадете колона с нарастващ брой намерени съвпадения, от 1 до общия брой грешки.Визуализация:
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))
прави някои кастинги на типове оракул.cast(multiset(.....)) as sys.OdciNumberList
трансформира множество колекции (по една колекция за всеки ред в оригиналния набор от данни) в една колекция от числа, OdciNumberList.table()
функция трансформира колекция в набор от резултати.
-
FROM
без съединение създава кръстосано присъединяване между вашия набор от данни и мултинабора. В резултат на това ред в набора от данни с 4 съвпадения ще се повтори 4 пъти (с нарастващ брой в колоната, наречена "column_value").Визуализация:
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))
използваcolumn_value
като n-тия_облик/възникване параметър заregexp_substr
.- Можете да добавите някои други колони от вашия набор от данни (
t.name, t.project
като пример) за лесна визуализация.
Някои препратки към документи на Oracle:
- REGEXP_REPLACE
- REGEXP_SUBSTR
- Константи, типове и съпоставяния на разширяемост (OdciNumberList)
- CAST (многонабор)
- Йерархични заявки