Untitled

                Never    
SQL
       
create or replace FUNCTION CAP_NAME(name IN VARCHAR2)
  RETURN VARCHAR2
IS
  lowered VARCHAR2(256);
  BEGIN
    IF (name IN ('ага', 'ад', 'ал', 'аль', 'ар', 'ас', 'аш', 'бей', 'бек', 'заде', 'зуль', 'кызы', 'оглы', 'оль', 'паша', 'сан', 'уль', 'хан', 'шах', 'эд', 'эль', 'эр')) THEN
          lowered := name;
        ELSE
          lowered := INITCAP(name);
        END IF;
    RETURN lowered;
  END CAP_NAME;
/
​
create or replace FUNCTION SPLIT_DEFIS_NAME(name IN VARCHAR2)
  RETURN VARCHAR2
IS
  normalized_defis VARCHAR2(256);
  BEGIN
    select listagg(t, '-') within group (order by ROWNUM) into normalized_defis from (select CAP_NAME(regexp_substr(name,'[^-]+', 1, level)) t from dual connect by regexp_substr(name, '[^-]+', 1, level) is not null);
    RETURN normalized_defis;
  END SPLIT_DEFIS_NAME;
/
​
create or replace FUNCTION NORMALIZE_NAME(name IN VARCHAR2)
  RETURN VARCHAR2
IS
  normalized VARCHAR2(256);
  BEGIN
    normalized := LOWER(TRIM(name));
    select listagg(t, ' ') within group (order by ROWNUM) into normalized from (select SPLIT_DEFIS_NAME(regexp_substr(normalized,'[^ ]+', 1, level)) t from dual connect by regexp_substr(normalized, '[^ ]+', 1, level) is not null);
    RETURN normalized;
  END NORMALIZE_NAME;
/
​
SELECT NORMALIZE_NAME('АННА БОГАЛИЙ-ТИТОВЕЦ') from DUAL; -- 'Анна Богалий-Титовец'
SELECT NORMALIZE_NAME('АЛЬ-КаДиР') from DUAL; -- 'аль-Кадир'
SELECT NORMALIZE_NAME('ФРАНЦ-ИОСИФ') from DUAL; -- 'Франц-Иосиф'
SELECT NORMALIZE_NAME('ЧИО-ЧИО-САН') from DUAL; -- 'Чио-Чио-сан'
SELECT NORMALIZE_NAME('МАМЕДОВ МАГСУД АЛАДДИН ОГЛЫ') from DUAL; -- 'Мамедов Магсуд Аладдин оглы'
SELECT NORMALIZE_NAME('МАМЕДОВ              МАГСУД АЛАДДИН-ОГЛЫ') from DUAL; -- 'Мамедов Магсуд Аладдин-оглы'
SELECT NORMALIZE_NAME('    ВАСЯ ') from DUAL; -- 'Вася'

Raw Text