特別な処理が'S...のような名前にのみ必要であると仮定します 、単純なREPLACEを追加します 動作するはずです。ところで、2つの別々のUPDATEは必要ありません ステートメント-INITCAP 頭文字以外の文字を自動的に小文字に変換します。:
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
これにより、'Sのすべての出現箇所が置き換えられます 'sを使用 。他のケースも処理する必要がある場合は、REGEXP_REPLACE()を試してみることをお勧めします。 。
関数NLS_INITCAP
いくつかのグローバリゼーションの問題に役立ちます。たとえば、Iの両方を大文字にします およびJ IJSLANDで 。しかし、それは'Sには役立ちません 名前。それがOracleのグローバリゼーション機能のバグなのか、それともこれらの都市名がすべて例外なのかはわかりません。