with t as (
select distinct naimen,
translate(upper(naimen), 'ЁABCEHKMOPTXY', 'ЕАВСЕНКМОРТХУ') as u
from sh.uch_vse
where naimen is not null
),
p as ( -- s = позиция, где начинается правовая форма
select naimen, u,
regexp_instr(u,
'(^|[^А-Я])(ООО|ОАО|ЗАО|ПАО|АО|НАО|ТОО|ФГУП|ГУП|МУП|НОУ|АНО|НКО|АКБ|КБ|АБ|АК|ИНК|ЛТД|ЛИМИТЕД|ГМБХ|ОБЩЕСТВО|ТОВАРИЩЕСТВО|ПРЕДПРИЯТИЕ|УЧРЕЖДЕНИЕ|ФОНД|КООПЕРАТИВ|АССОЦИАЦИЯ|ОБЪЕДИНЕНИЕ)([^А-Я]|$)',
1, 1, 0, null, 2) as s
from t
),
c as ( -- e = позиция, где начинается хвост (реквизиты)
select naimen, s,
regexp_instr(substr(u, s),
'КПП|ИНН|ОГРН|ОКПО|БИК|Р/С|Р/СЧ|К/С|РАСЧ|СЧЕТ|№|[0-9]{9,}') as e
from p
where s > 0
),
r as (
select regexp_replace(
case when e > 0 then substr(naimen, s, e - 1)
else substr(naimen, s) end,
'^[[:space:],;.-]+|[[:space:],;.-]+$', '') as org
from c
)
select distinct org as "Наименование"
from r
where length(org) > 3
union
-- запасной вариант: нет правовой формы, но есть название в кавычках
select distinct regexp_substr(naimen, '["«“][^"»”]+["»”]')
from p
where s = 0
and regexp_like(u, '["«»“”'']')
and not regexp_like(u, '(^|[^А-Я])(ИП|ПБОЮЛ|ЧП)([^А-Я]|$)|ПРЕДПРИНИМАТЕЛ')
and regexp_substr(naimen, '["«“][^"»”]+["»”]') is not null
order by 1;