Database PL/SQL过程:将大写名称更新为initcaps,并对某些值进行特殊处理

Database PL/SQL过程:将大写名称更新为initcaps,并对某些值进行特殊处理,database,oracle,plsql,procedure,Database,Oracle,Plsql,Procedure,我需要一个程序来做这样的事情:原名:阿姆斯特丹新名:阿姆斯特丹。 我为此制定了以下程序: create or replace PROCEDURE NaamRoutine is BEGIN update Gemeentenew set gemeentenaam = lower(gemeentenaam); update Gemeentenew set gemeentenaam = initcap(gemeentenaam); END; 问题是有两个名称以'S GRAVENHAG

我需要一个程序来做这样的事情:原名:阿姆斯特丹新名:阿姆斯特丹。 我为此制定了以下程序:

create or replace PROCEDURE NaamRoutine
is
BEGIN
  update Gemeentenew
  set gemeentenaam = lower(gemeentenaam);
  update Gemeentenew
  set gemeentenaam = initcap(gemeentenaam); 
END;

问题是有两个名称以'S GRAVENHAGE开头,需要是'S GRAVENHAGE。

假设只需要对
之类的名称进行特殊处理。
,添加一个简单的
替换应该可以。顺便说一句,您不需要两个单独的
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
这将用
替换所有出现的
。如果您还需要处理其他情况,我建议您尝试
REGEXP\u REPLACE()


该函数有助于解决一些全球化问题。例如,它将
IJSLAND
中的
I
J
都大写。但是它对
名称没有帮助。我不确定这是否是Oracle全球化功能的一个缺陷,或者这些城市名称是否都是例外。

首先,如果您想操作同一字段两次,请嵌套它们,而不是单独执行它们

select initcap( lower( '''S GRAVENHAGE' )) as Resp from dual;
但是,在这种情况下,您甚至不需要这样做
initcap
将自己为您提供所需的一切

现在,如果您有一个以“s”和一个空格('s xxx)开头的东西,那么您可以通过正则表达式替换来运行它

select regexp_replace( initcap( '''S GRAVENHAGE' ), '^''S ', '''s ' ) as Resp from dual;

它应该是
''的
,而不是
。啊,所以单引号是数据的一部分。容易修复,如图所示。