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


1
with t as (
    select distinct naimen,
           translate(upper(naimen), 'ЁABCEHKMOPTXY', 'ЕАВСЕНКМОРТХУ') as u
    from sh.uch_vse
    where naimen is not null
)
select naimen as "Наименование"
from t
where regexp_like(u, '(^|[^А-Я])(ООО|ОАО|ЗАО|ПАО|АО|НАО|ТОО|ФГУП|ГУП|МУП|НОУ|АНО|НКО|АКБ|КБ|АБ|АК|ИНК|ЛТД|ЛИМИТЕД|ГМБХ)([^А-Я]|$)')
   or regexp_like(u, 'ОБЩЕСТВ|ТОВАРИЩЕСТВ|ПРЕДПРИЯТИ|УЧРЕЖДЕНИ|ФОНД|ОРГАНИЗАЦ|ОБЪЕДИНЕНИ|АССОЦИАЦ|СОЮЗ|ПАРТНЕРСТВ|КОМПАНИ|КООПЕРАТИВ')
   or regexp_like(upper(naimen), '(^|[^A-Z])(LLC|LTD|INC|GMBH|CORP|LIMITED|JSC)([^A-Z]|$)')
   or (regexp_like(u, '["«»“”'']')
       and not regexp_like(u, '(^|[^А-Я])(ИП|ПБОЮЛ|ЧП)([^А-Я]|$)|ПРЕДПРИНИМАТЕЛ'))
order by 1;


обратный
with t as (
    select distinct naimen,
           translate(upper(naimen), 'ЁABCEHKMOPTXY', 'ЕАВСЕНКМОРТХУ') as u
    from sh.uch_vse
    where naimen is not null
)
select naimen as "Наименование"
from t
where not (
       regexp_like(u, '(^|[^А-Я])(ООО|ОАО|ЗАО|ПАО|АО|НАО|ТОО|ФГУП|ГУП|МУП|НОУ|АНО|НКО|АКБ|КБ|АБ|АК|ИНК|ЛТД|ЛИМИТЕД|ГМБХ)([^А-Я]|$)')
    or regexp_like(u, 'ОБЩЕСТВ|ТОВАРИЩЕСТВ|ПРЕДПРИЯТИ|УЧРЕЖДЕНИ|ФОНД|ОРГАНИЗАЦ|ОБЪЕДИНЕНИ|АССОЦИАЦ|СОЮЗ|ПАРТНЕРСТВ|КОМПАНИ|КООПЕРАТИВ')
    or regexp_like(upper(naimen), '(^|[^A-Z])(LLC|LTD|INC|GMBH|CORP|LIMITED|JSC)([^A-Z]|$)')
    or (regexp_like(u, '["«»“”'']')
        and not regexp_like(u, '(^|[^А-Я])(ИП|ПБОЮЛ|ЧП)([^А-Я]|$)|ПРЕДПРИНИМАТЕЛ'))
)
order by 1;



справочник: 
begin
    execute immediate 'drop table spr_gorod purge';
exception
    when others then null;
end;
/

create table spr_gorod (
    id   number generated always as identity primary key,
    name varchar2(100) not null unique
);

insert into spr_gorod (name)
with src as (
    select length(trim(naimen)) as len,
           regexp_replace(translate(upper(trim(naimen)), 'ЁABCEHKMOPTXY', 'ЕАВСЕНКМОРТХУ'),
                          '[[:space:]]+', ' ') as u
    from sh.uch_vse
    where naimen is not null
),
ext as (
    select len, u,
           regexp_substr(u,
               '(^|[^А-Я])Г(ОРОД|ОР)?[. ]+(((НИЖНИЙ|НИЖНЕМ|ВЕЛИКИЙ|ВЕЛИКОМ|ВЕЛИКИЕ|НОВЫЙ|СТАРЫЙ|НАБЕРЕЖНЫЕ|МИНЕРАЛЬНЫЕ|СЕРГИЕВ|БЕЛАЯ|МАЛАЯ|БОЛЬШОЙ|СОСНОВЫЙ|ЗАПАДНАЯ) )?[А-Я]+(-[А-Я]+)*)',
               1, 1, null, 3) as city
    from src
),
norm as (
    select regexp_replace(city, '(СК|ЦК|ОВ|ГРАД|ГОРОД|БУРГ|ОРГ|РОГ)[АУЕ]$', '\1') as city
    from ext
    where length(city) >= 3
      and not (len >= 50 and u like '%' || city)
),
fix as (
    select regexp_substr(column_value, '[^=]+', 1, 1) as bad,
           regexp_substr(column_value, '[^=]+', 1, 2) as good
    from table(sys.odcivarchar2list(
        'МОС=МОСКВА', 'МОСК=МОСКВА',
        'САНКТ=САНКТ-ПЕТЕРБУРГ', 'САНКТ-ПЕТЕР=САНКТ-ПЕТЕРБУРГ', 'САНКТ-ПЕТЕРБУГ=САНКТ-ПЕТЕРБУРГ',
        'С-ПЕТЕРБУРГ=САНКТ-ПЕТЕРБУРГ', 'С-ПБ=САНКТ-ПЕТЕРБУРГ', 'СПБ=САНКТ-ПЕТЕРБУРГ',
        'РОСТОВ-НА=РОСТОВ-НА-ДОНУ', 'РОСТОВ=РОСТОВ-НА-ДОНУ','БОЛЬШОЙ=БОЛЬШОЙ КАМЕНЬ', 'РОСТОВА-НА-ДОНУ=РОСТОВ-НА-ДОНУ',
        'НОВОСИБ=НОВОСИБИРСК', 'НАБ=НАБЕРЕЖНЫЕ ЧЕЛНЫ', 'СЫЗ=СЫЗРАНЬ', 'ПОДОЛ=ПОДОЛЬСК',
        'ТЮМЕН=ТЮМЕНЬ', 'ОРЕХОВО=ОРЕХОВО-ЗУЕВО', 'В-ЛУКИ=ВЕЛИКИЕ ЛУКИ', 'ВЛ-КА=ВЛАДИВОСТОК',
        'ВЕЛИКОМ НОВГОРОД=ВЕЛИКИЙ НОВГОРОД', 'НИЖНЕМ НОВГОРОД=НИЖНИЙ НОВГОРОД',
        'КАЗАИЬ=КАЗАНЬ', 'КИРОВО-ЧЕПЕЧК=КИРОВО-ЧЕПЕЦК', 'АРАМИЛЬ-ТРАНЗИТНЫЙ=АРАМИЛЬ',
        'ЧЕРЕПОВЦЕ=ЧЕРЕПОВЕЦ', 'СТАВРОПОЛЕ=СТАВРОПОЛЬ', 'ЩЕРБИНКЕ=ЩЕРБИНКА', 'СУРГУТЕ=СУРГУТ',
        'МУРОМЕ=МУРОМ', 'СЕБЕЖЕ=СЕБЕЖ', 'ЭНГЕЛЬСЕ=ЭНГЕЛЬС', 'ЮБИЛЕЙНОГО=ЮБИЛЕЙНЫЙ',
        'ЖУКОВСА=ЖУКОВСКИЙ', 'НОВОВОРОНЕЖУ=НОВОВОРОНЕЖ', 'АРТЕМУ=АРТЕМ',
        'ОСБ=', 'Ф-Л=', 'ФОНД=', 'БОЛЬНИЦА=', 'КОЛЛЕГИЯ=', 'ЦЕНТРАЛЬНОЕ=', 'ЦЕНТРСТРОЙ=',
        'ТЕХНО=', 'ТОРГОВЫЙ=', 'ПЕТ=', 'МЕЩАНСКОЕ=', 'ЛЮБЛИНСКОЕ=',
        'МАРЬИНОРОЩИНСКОЕ=', 'ТРУСОВСКОЕ=', 'КИЕВСКОЕ=', 'ЗЕЛЕНОГРАДСКОЕ='))
)
select distinct coalesce(f.good, n.city)
from norm n
left join fix f on f.bad = n.city
where f.bad is null or f.good is not null;

delete from spr_gorod s
where exists (
    select 1 from spr_gorod x
    where x.id <> s.id
      and (   x.name like s.name || ' %'
           or (regexp_like(s.name, '[АУЕИЫЯ]$')
               and x.name in (substr(s.name, 1, length(s.name) - 1),
                              substr(s.name, 1, length(s.name) - 1) || 'А',
                              substr(s.name, 1, length(s.name) - 1) || 'Ь')))
);

commit;

select * from spr_gorod order by name;