Как заменить в тексте токены значениями из таблицы замен?

Есть таблица 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
/
→ Ссылка