Посмотрел задачу. Мне кажется, что эта проблема решается с использованием таблицы соответствий полных и коротких правовых форм. Вот скрипт:
--таблица с заводами
create table test_tbl
(
Name_full text
);
insert into test_tbl
select 'Акционерное общество "Саранский завод Пупкина"';
--таблица соответствий правовых форм
create table prav_forms
(
short_form text,
full_form text
);
--заполняем таблицу
insert into prav_forms(short_form,full_form)
select 'ао','акционерное общество'
union
select 'зао','закрытое акционерное общество'
union
select 'ооо','общество с ограниченной ответственностью';
--выходной запрос
with ish as(
--что ищем
select 'ао "Саранский завод Пупкина"'::text as search_str
),
ish2 as (
--получаем форму и завод регулярками
select (regexp_matches(search_str, '(\w+)'))[1] as form,
(regexp_matches(search_str, '\"[\w\s]+\"'))[1] as form2
from ish
)
,
ish3 as (
--находим запись по короткому наименованию
select * from test_tbl where lower(Name_full)=(select lower(search_str) from ish limit 1)
)
--выборка
select * from ish3
union
--если по короткому не найдено, то получаем полную форму и ищем по ней
select * from test_tbl tt
where not exists(select * from ish3)
and lower(tt.Name_full) in (select
lower(pv.full_form || ' ' || ish2.form2)
from ish2 inner join prav_forms pv on
lower(pv.short_form)=lower(ish2.form)
limit 1
);