Есть две проблемы с требуемым выводом.Во-первых, как определить токены, которые вы хотите исключить («on», «at» и т. Д.).Второй - как игнорировать пробел в определенных токенах («Электрическая компания», «билеты в кино»).
Достаточно просто решить пункт один с помощью двухэтапного процесса.Шаг # 1 разбивает строку на пробелы, шаг # 2 удаляет нежелательные токены:
with exclude as (
select 'in' as tkn from dual union all
select 'at' as tkn from dual union all
select 'to' as tkn from dual union all
select 'on' as tkn from dual
)
, str as (
select id
, level as element_order
, regexp_substr(txt, '[^ ]+', 1, level) as tkn
from t23
where id = 10
CONNECT BY level <= regexp_count(txt, '[^ ]+')+1
and id = prior id
and prior sys_guid() is not null
)
select row_number() over (partition by str.id order by str.element_order) as element
, str.tkn as element_value
from str
left join exclude on exclude.tkn = str.tkn
where exclude.tkn is null
and str.tkn is not null
;
Вот Демонстрация SQL Fiddle .
Второй момент довольнотрудно решить.Полагаю, вам понадобится еще одна справочная таблица для идентификации звонящих, и, возможно, используйте listagg()
для их объединения.