database - 对某些值进行特殊处理的 PL/SQL 过程 : UPDATE uppercase names to initcaps,

标签 database oracle plsql procedure

我需要一个程序来做这样的事情:原始名称: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 中将 IJ 都大写。但它对 'S 名称没有帮助。我不确定这是否是 Oracle 全局化功能的一个错误,或者这些城市名称是否都是异常(exception)。

关于database - 对某些值进行特殊处理的 PL/SQL 过程 : UPDATE uppercase names to initcaps,,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24174226/

相关文章:

sql - 如何执行带动态计数的GO语句?

oracle - SQL Developer 不显示 dbms_output

sql - 如何在循环中使用 select in continue when 语句?

sql-server - 两个查询的效率更高?

sql - 如何创建两个日期相减的函数?

java - MySQL 在加载到数据库时支持并行吗?

php - 如何使数据库能够读写 "ÆØÅ"?

mysql - php删除脚本

oracle - Oracle APEX 中人类可读的 URL

sql - 在单个查询中通过 oracle 根据优先级获取单个记录