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

GSa*_*ngs 6 sql oracle

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

Ank*_*ani 17

使用转换函数和相应的字符集

select CONVERT('JUAN ROMÄN', 'US7ASCII') from dual;
Run Code Online (Sandbox Code Playgroud)

下面是可以在oracle中使用的charset:

US7ASCII: US 7-bit ASCII character set
WE8DEC: West European 8-bit character set
WE8HP: HP West European Laserjet 8-bit character set
F7DEC: DEC French 7-bit character set
WE8EBCDIC500: IBM West European EBCDIC Code Page 500
WE8PC850: IBM PC Code Page 850
WE8ISO8859P1: ISO 8859-1 West European 8-bit character set
Run Code Online (Sandbox Code Playgroud)


Bac*_*acs 14

您可以使用replace,regexp_replace或者translate,但是他们每个都要求您将所有可能的重音字符映射到它们的非重音版本.

或者,有一个函数被调用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;
Run Code Online (Sandbox Code Playgroud)

试试这个,扩展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;
Run Code Online (Sandbox Code Playgroud)

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

ETA:nlssort()如果不对大小写不敏感,则不能对重音不敏感,因此此解决方案将始终转换为小写.upper()当然,将上面的表达式包含在内将使您的示例值返回"JUAN ROMAN".如果您的值可以是大小写混合,并且您需要保留每个字符的大小写,并且initcap()不够灵活,那么您将需要编写一些PL/SQL.

  • @ErickAstoOblitas这应该是一个新问题,如果还没有.如果你的意思是ASCII null,那么`rtrim(your_string,chr(0))`应该这样做. (2认同)