Как заменить в тексте токены значениями из таблицы замен?
Есть таблица t1 с наименованиями организаций:
| NAME |
|---|
| ЗАО РОМАШКА |
| РОМАШКА ЗАО |
| ООО ПУПКИ |
| АО ИППОДРОМ |
Хочу убрать из названия организационные правовые формы (АО, ЗАО и тд). Использую примерно следующую конструкцию.
select
NAME,
regexp_replace(NAME, '((^|\s|\W)ЗАО($|\s|\W))|((^|\s|\W)ООО($|\s|\W))|((^|\s|\W)АО($|\s|\W))|((^|\s|\W)ИП($|\s|\W))') as c_name
from t1
Как проделать это, имея справочник замен t2
| NAME | REPLACER |
|---|---|
| ЗАО | 1 |
| АО | 2 |
| ... | ... |
| ИП | 50 |
То есть, берем первую строку из t1 и по всем заменам из t2 прогоняем.
Подскажите, как это лучше реализовать?
Ответы (1 шт):
Автор решения: 0xdb
→ Ссылка
Попробуйте вот так:
select regexp_replace (t1.name, '(^|\W)'||t2.name||'($|\W)', t2.replacer) result
from t1
join t2 on regexp_like (t1.name, '((^|\W)'||t2.name||'($|\W))')
/
Результат (тестовые данные см. ниже):
RESULT
----------------
1РОМАШКА
РОМАШКА1
2ИППОДРОМ
create table t1 (name) as
select trim (column_value) from xmlTable ('
"ЗАО РОМАШКА",
"РОМАШКА ЗАО",
"ООО ПУПКИ",
"АО ИППОДРОМ"')
/
create table t2 (name, replacer) as
select 'ЗАО', '1' from dual union all
select 'АО', '2' from dual union all
select 'ИП', '50' from dual
/