Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Procedimento PL/SQL:UPDATE nomes em maiúsculas para initcaps, com tratamento especial para alguns valores


Assumindo que o tratamento especial é necessário apenas para nomes como 'S... , adicionando um simples REPLACE Deveria trabalhar. BTW, você não precisa de dois UPDATE separados instruções - INITCAP converterá automaticamente caracteres não iniciais em minúsculas.:
with v_data(name) as (
  select 'AMSTERDAM' from dual union all
  select '''S GRAVENHAGE' from dual union all
  select 'DEN HAAG' from dual union all
  select 'IJSLAND' from dual
  )
select 
  replace(nls_initcap(name, 'NLS_SORT=xDutch'), '''S', '''s') name
from v_data

Name
----
Amsterdam
's Gravenhage
Den Haag
IJsland

Isso substituirá todas as ocorrências de 'S com 's . Se você também precisa lidar com outros casos, sugiro que tente REGEXP_REPLACE() .

A função NLS_INITCAP ajuda com alguns problemas de globalização. Por exemplo, ele capitaliza tanto o I e o J em IJSLAND . Mas não ajuda com 'S nomes. Não tenho certeza se isso é um bug com as funções de globalização da Oracle ou se esses nomes de cidades são exceções.