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;
它应该是''的
,而不是的
。啊,所以单引号是数据的一部分。容易修复,如图所示。