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


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\.)| {4,}| / |Р\\СЧ|,\s*(ОАО|ЗАО)\s*[''"«]?ПСБ') 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
),
k1 as (  -- чистка хвостов после кавычек и двойных пробелов
    select regexp_replace(
             regexp_replace(
               regexp_replace(org, ' {2,}', ' '),
               '(["»”'']) *,? +(В|ПО|ДО|ДУ|РАСЧЕТЫ)( .*)?$', '\1', 1, 1, 'i'),
             ' *,? *(ОАО|ЗАО) *[''"«]?(ПСБ|МИНБ).*$', '', 1, 1, 'i') as org
    from r
),
k as (  -- одно слово после закрывающей кавычки = название отделения банка, режем
    select case
             when mod(regexp_count(org, '["«»“”'']'), 2) = 0
              and regexp_like(org, '["»”''] *,? *[А-Я-]+\.?$', 'i')
              and not regexp_like(org, '["»”''] *,? *(ОАО|ЗАО|ПАО|АО|ООО|ЛТД|ИНК|ГМБХ|ЛИМИТЕД)\.?$', 'i')
             then regexp_replace(org, '(["»”'']) *,? *[А-Я-]+\.?$', '\1', 1, 1, 'i')
             else org
           end as org
    from k1
)
-- 1) форма стоит перед названием
select distinct org as "Наименование"
from k
where regexp_like(
        regexp_replace(upper(org), '^[^ "«“''`(]+|\((ОАО|ЗАО|ПАО|АО|ООО)\)', ''),
        '[А-ЯA-Z0-9]{3}')
  and not regexp_like(org, '^[^ ]+ *[`"«“''][^`"«»“”'' ]{1,5}$')
  and not regexp_like(upper(org),
        '^(ООО|ОАО|ЗАО|ПАО|АО|АКБ|АБ|АК|ГУП|МУП)[ ,.()]+(ООО|ОАО|ЗАО|ПАО|АО)[ ,.()]*$')
union
-- 2) форма стоит после названия: ... ИНК / ЛИМИТЕД / ЛТД / ГМБХ
select distinct
       regexp_replace(
         substr(naimen, 1,
                regexp_instr(u, '(^|[^А-Я])(ИНК|ЛИМИТЕД|ЛТД|ГМБХ)([^А-Я]|$)', 1, 1, 1, null, 2) - 1),
         '^[[:space:],;.-]+', '')
from p
where s = 0
  and regexp_like(u, '[А-Я0-9]{3}[^А-Я]+(ИНК|ЛИМИТЕД|ЛТД|ГМБХ)([^А-Я]|$)')
union
-- 3) формы нет, есть название в кавычках (без ИП и без ФИО)
select distinct
       regexp_replace(
         regexp_replace(regexp_substr(naimen, '["«“][^"»”]+["»”]'),
                        '^(["«“]) +', '\1'),
         ' +(["»”])$', '\1')
from p
where s = 0
  and regexp_like(u, '["«»“”'']')
  and not regexp_like(u, '(^|[^А-Я])(ИП|ПБОЮЛ|ЧП)([^А-Я]|$)|ПРЕДПРИНИМАТЕЛ')
  and not regexp_like(u, '[А-Я]\. ?[А-Я]\.')
  and not regexp_like(u, '[А-Я]+(ВИЧ|ВНА|ЬИЧ|ИЧНА|ОГЛЫ|КЫЗЫ)([^А-Я]|$)')
  and regexp_like(regexp_substr(naimen, '["«“][^"»”]+["»”]'), '["«“] *[А-ЯA-Z0-9][^"»”]{2,}')
order by 1;