如何替换oracle中varchar2列中的重音字母

时间:2015-03-03 16:45:51

标签: sql oracle

我有一个名为NAME_USER的varchar2列。例如,数据是:JUANROMÄN但我尝试显示JUAN ROMAN,在我的语句结果中将Á替换为A.我怎样才能做到这一点?。提前谢谢。

4 个答案:

答案 0 :(得分:13)

您可以使用replaceregexp_replacetranslate,但每个人都要求您将所有可能的重音字符映射到他们的非重音版本。

或者,还有一个名为nlssort()的函数,它通常用于覆盖用于order by子句的默认语言设置。它有一个重音不敏感排序选项,可以创造性地误用来解决你的问题。 nlssort()返回二进制文件,因此您必须使用utl_raw.cast_to_varchar2()转换回varchar2:

select utl_raw.cast_to_varchar2(nlssort(NAME_USER, 'nls_sort=binary_ai'))
from YOUR_TABLE;

尝试此操作,获取扩展ASCII集中的重音字符列表及其派生的非重音值:

select level+192 ascii_code,
       chr(level+192) accented,
       utl_raw.cast_to_varchar2(nlssort(chr(level+192),'nls_sort=binary_ai')) unaccented
from dual
connect by level <= 63
order by 1;

不是我的回答 - 之前我已经使用了它,似乎工作正常,但不得不相信这篇文章:https://community.oracle.com/thread/1117030

ETA:nlssort()无法对不区分大小写进行重音不敏感,因此此解决方案始终会转换为小写。将上面的表达式括在upper()中当然会将您的示例值返回到&#34; JUAN ROMAN&#34;。如果您的值可以是大小写混合,并且您需要保留每个字符的大小写,并且initcap()不够灵活,那么您需要编写一些PL / SQL。< / p>

答案 1 :(得分:12)

转换功能与相应的字符集

一起使用
select d.department_id, count(*) as num_instructors
from departments d
     inner join instructors i on i.department_id = d.department_id
group by d.department_id;

下面是可以在oracle中使用的字符集:

select CONVERT('JUAN ROMÄN', 'US7ASCII') from dual;

答案 2 :(得分:0)

select replace('JUAN ROMÄN','Ä','A')
from dual;

如果要制作更多映射,可以使用TRANSLATE ...

答案 3 :(得分:0)

您可以使用正则表达式:

SELECT regexp_replace('JUAN ROMÄNí','[[=A=]]+','A' )
FROM dual;