我需要一个程序来做这样的事情:原始名称:AMSTERDAM 新名称:Amsterdam。 我为此做了这个程序:
create or replace PROCEDURE NaamRoutine
is
BEGIN
update Gemeentenew
set gemeentenaam = lower(gemeentenaam);
update Gemeentenew
set gemeentenaam = initcap(gemeentenaam);
END;
问题是有几个名字以 'S GRAVENHAGE 开头,并且需要是 's Gravenhage。
最佳答案
假设只有像 'S...
这样的名称才需要特殊处理,添加一个简单的 REPLACE
应该可以。顺便说一句,您不需要两个单独的 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
帮助解决一些全局化问题。例如,它在 IJSLAND
中将 I
和 J
都大写。但它对 'S
名称没有帮助。我不确定这是否是 Oracle 全局化功能的一个错误,或者这些城市名称是否都是异常(exception)。
关于database - 对某些值进行特殊处理的 PL/SQL 过程 : UPDATE uppercase names to initcaps,,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24174226/