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


SELECT
    COUNT(*) OVER () AS всего_строк,
    FIO
FROM (
    WITH t AS (
        SELECT
            REGEXP_SUBSTR(
                REGEXP_REPLACE(
                    NAIMEN,
                    '^((КПП[[:space:]]+[0-9]+|КПП|ПРЕДПРИНИМАТЕЛЬ[А-Яа-яЁё]*|ИП|ЧП|ФЛ|[0-9]+)[[:space:]]+)+',
                    '', 1, 0, 'i'
                ),
                -- ФИО может стоять НЕ в начале: ищем по всей строке
                '([А-ЯЁ][А-Яа-яЁё\-]+'
                || '('
                ||   '[[:space:]]+[А-ЯЁ]\.[[:space:]]*[А-ЯЁ]\.'
                ||  '|[[:space:]]+[А-ЯЁ][А-Яа-яЁё\-]+'
                ||     '([[:space:]]+[А-ЯЁ][А-Яа-яЁё\-]+)?'
                ||     '([[:space:]]+(ОГЛЫ|ОГЛУ|КЫЗЫ|УГЛЫ|УУЛУ|ГИРЕЙ|ХАН|БЕК|БАЙ))?'
                || '))'
            ) AS FIO
        FROM SH.UCH_VSE
        WHERE NAIMEN IS NOT NULL
    )
    SELECT DISTINCT FIO
    FROM t
    WHERE FIO IS NOT NULL
      AND REGEXP_LIKE(FIO, '^[А-ЯЁ]', 'c')
      AND REGEXP_LIKE(FIO, '[[:space:]]', 'c')
      AND LENGTH(FIO) BETWEEN 6 AND 40
      AND NOT REGEXP_LIKE(REGEXP_SUBSTR(FIO, '^[^[:space:]]+'), '^[А-ЯЁ]{2,3}$', 'c')
      AND REGEXP_LIKE(
            UPPER(REGEXP_SUBSTR(FIO, '^[^[:space:]]+')),
            '(ОВ|ЕВ|ЁВ|ИН|ЫН|ИЙ|ЫЙ|ОЙ|СКИЙ|ЦКИЙ|СКАЯ|ЦКАЯ|'
            || 'ЕНКО|УК|ЮК|ЧУК|ЩУК|АК|ЯК|ИК|ИЧ|АЙ|ЯЙ|'
            || 'ШВИЛИ|ДЗЕ|ИДЗЕ|ЯН|ЯНЦ|ОГЛЫ|ОГЛУ|КЫЗЫ|УГЛЫ|УУЛУ|'
            || 'ГИРЕЙ|ХАН|БЕК|БАЙ|ЕЦ|ЕНОК|КО|ОВА|ЕВА|ИНА|ЫНА|ЁВА|'
            || 'О|А|Е|И|У|Ю|Я)$',
            'i'
          )
    ORDER BY FIO
);