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


WITH
stop_w AS (
    SELECT REPLACE(REPLACE(q'[ООО,ОАО,ПАО,ЗАО,АО,ОДО,ОСБ,АКБ,КБ,ГУП,МУП,ФГУП,ФУ,КОРПОРЕЙШН,СОФТ,ИНТЕРНЭШНЛ,МЭП,ХОЗ-ВО,РУФПС,
ПАЛАТА,ОАНО,УЗЕЛ,КОНЦЕРН,ФОНД,БАНК,КОМПАНИЯ,ПРЕДПРИЯТИЕ,ОБЩЕСТВО,СОЮЗ,ВКЛАДЫ,ГРАЖДАН,КОРПОРАЦИЯ,КОРПОРАЦИИ,
ИНСТИТУТ,ПОДРАЗДЕЛЕНИЕ,СЕТИ,ОТД,МЕДИА,КЛУБ,РАЙПО,УСИБ,ОБЩ-ВО,ЕДИНЕНИЕ,СКАНСКА,ОТДЕЛЕНИЕ,ПОСОЛЬСТВО,ПОДВОРЬЕ,
КОНСУЛЬТАЦИЯ,СОВЕТ,ФИЛИАЛ,ЗАВОД,ОБЛПО,ГРУППА,СЧЕТ,РЕДАКЦИЯ,НПФ,ГП,ЧАСТЬ,РПЦ,ПИИ,ЭКСПЕДИЦИЯ,ГОСТИНИЦА,СНГ,
ПАРТИЯ,БЮРО,ЕДИНИЦА,Ф-Л,ТУРИЗМ,УМП,ДОМ,ТОВАРИЩЕСТВО,ФИН,РУПС,МЭИ,ЖСК,ТСЖ,ВДПО,ГМБХ,МИНФИН,МИНИФИН,РОС-Я,АРТЕЛЬ,
СИСТЕМС,СОДЕКСО,З-Д,Ф-Т,ЛИМИТЕД,ГОС,НЕФТЕБАЗА,ВЭИ,КОМБИНАТ,КООПЕРАТИВ,ДИСТАНЦИЯ,ЖИЛЬЕ,ЛИЦО,ЛИЦА,ХОЗЯЙСТВО,
УЧАСТОК,ШАХТА,ИСТЕРН,ПССП,ОТКРЫТОЕ,ЗАКРЫТОЕ,АКЦИОНЕРНОЕ,ГОРОД,ГОРОДА]', CHR(10)), CHR(13)) AS s
    FROM DUAL
),
stop_p AS (
    SELECT REPLACE(REPLACE(q'[НЕВЫЯСНЕ,ПАРТНЕР,ОБЪЕДИ,АДМИНИСТРА,УПРАВЛЕНИ,ДЕПАРТАМЕНТ,КОМИТЕТ,МИНИСТЕРСТВ,ПОЛИТИЧ,ПРЕДСТАВИТ,
ФЕДЕРАЛЬН,ГОСУДАРСТВЕНН,МЕЖДУНАРОДН,ОРГАНИЗАЦИ,ПРОИЗВОДСТВЕН,РАЙОН,ПТИЦЕФАБРИК,ФАБРИК,ЗАКРЫТ,ОТКРЫТ,АКЦИОНЕРН,
МОСКОВСК,МАШИНОСТРО,ГОРОДСК,СЕВЕРН,СЕВЕРО,ЮЖНО-,ЦЕНТР,ФИРМ,ГЛАВН,УПРАВ,ОБЩЕСТ,РОССИЙСК,КОМПАНИ]', CHR(10)), CHR(13)) AS s
    FROM DUAL
),
stop AS (
    SELECT TRIM(REGEXP_SUBSTR(s, '[^,]+', 1, LEVEL)) AS WORD, 'WORD' AS MATCH_TYPE
    FROM stop_w CONNECT BY LEVEL <= REGEXP_COUNT(s, ',') + 1
    UNION ALL
    SELECT TRIM(REGEXP_SUBSTR(s, '[^,]+', 1, LEVEL)), 'PREFIX'
    FROM stop_p CONNECT BY LEVEL <= REGEXP_COUNT(s, ',') + 1
),
src AS (
    SELECT DISTINCT NAIMEN FROM SH.UCH_VSE WHERE NAIMEN IS NOT NULL
),
norm AS (
    SELECT
        REGEXP_REPLACE(TRIM(NAIMEN), '[[:space:]]+', ' ')                      AS NAIMEN,
        ' ' || TRIM(REGEXP_REPLACE(UPPER(NAIMEN), '[^А-ЯЁ0-9-]+', ' ')) || ' ' AS TOK
    FROM src
),
clean AS (
    SELECT n.NAIMEN
    FROM norm n
    WHERE NOT EXISTS (
        SELECT 1 FROM stop s
        WHERE (s.MATCH_TYPE = 'WORD'   AND INSTR(n.TOK, ' ' || s.WORD || ' ') > 0)
           OR (s.MATCH_TYPE = 'PREFIX' AND INSTR(n.TOK, ' ' || s.WORD)        > 0)
    )
),
t AS (
    SELECT REGEXP_SUBSTR(
               REGEXP_REPLACE(NAIMEN,
                   '^((КПП|ПБОЮЛ|ИП|ЧП|ФЛ|ИНДИВИДУАЛЬН[А-ЯЁ]*|ПРЕДПРИНИМАТЕЛЬ[А-ЯЁ]*|[0-9]+) )+',
                   '', 1, 1, 'i'),
               '^[А-ЯЁ][-А-ЯЁ]+'
               || '( [А-ЯЁ]\.? ?[А-ЯЁ]\.'
               || '| [А-ЯЁ][-А-ЯЁ]+( [А-ЯЁ][-А-ЯЁ]+)?'
               ||   '( (ОГЛЫ|ОГЛУ|КЫЗЫ|УГЛИ|УУЛУ|ГИРЕЙ|ХАН|БЕК|БАЙ))?)',
               1, 1, 'i') AS FIO
    FROM clean
),
f AS (
    SELECT DISTINCT FIO
    FROM t
    WHERE FIO IS NOT NULL
      AND REGEXP_LIKE(FIO, '^[А-ЯЁ]', 'c')
      AND LENGTH(FIO) BETWEEN 6 AND 40
      AND LENGTH(REGEXP_SUBSTR(FIO, '^[^ ]+')) > 3
      AND REGEXP_LIKE(UPPER(REGEXP_SUBSTR(FIO, '^[^ ]+')),
          '(ОВ|ЕВ|ЁВ|ИН|ЫН|ИЙ|ЫЙ|ОЙ|ЯН|ЯНЦ|ЕЦ|ЕНОК|ИЧ|УК|ЮК|АК|ЯК|ИК|ХАН|БЕК|БАЙ|[АЕИОУЮЯ])$')
)
SELECT COUNT(*) OVER () AS Всего_строк, FIO
FROM f
ORDER BY FIO;