Forudsat at den særlige håndtering kun er nødvendig for navne som 'S... , ved at tilføje en simpel REPLACE burde virke. BTW, du behøver ikke to separate UPDATE udsagn - INITCAP vil automatisk konvertere ikke-indledende tegn til små bogstaver.:
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
Dette vil erstatte alle forekomster af 'S med 's . Hvis du også har brug for at håndtere andre sager, foreslår jeg, at du prøver REGEXP_REPLACE() .
Funktionen NLS_INITCAP
hjælper med nogle globaliseringsproblemer. For eksempel bruger den både I med stort og J i IJSLAND . Men det hjælper ikke med 'S navne. Jeg er ikke sikker på, om det er en fejl med Oracles globaliseringsfunktioner, eller om disse bynavne alle er undtagelser.