Загрузка данных


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]{6,}|(^|[^A-Z])(N ?[0-9]|R\.)') 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
-- после формы и скобок (ОАО)/(ЗАО) должно остаться хотя бы 3 символа названия
where regexp_like(
        regexp_replace(upper(org), '^[^ "«“''(]+|\((ОАО|ЗАО|ПАО|АО|ООО)\)', ''),
        '[А-ЯA-Z0-9]{3}')
union
-- запасной вариант: нет формы, но есть название в кавычках (кроме ИП и ФИО с инициалами)
select distinct regexp_substr(naimen, '["«“][^"»”]+["»”]')
from p
where s = 0
  and regexp_like(u, '["«»“”'']')
  and not regexp_like(u, '(^|[^А-Я])(ИП|ПБОЮЛ|ЧП)([^А-Я]|$)|ПРЕДПРИНИМАТЕЛ')
  and not regexp_like(u, '[А-Я]\. ?[А-Я]\.')
  and regexp_substr(naimen, '["«“][^"»”]+["»”]') is not null
order by 1;