我有一个名为NAME_USER的varchar2列。例如,数据是:JUANROMÄN但我尝试显示JUAN ROMAN,在我的语句结果中将Á替换为A.我怎样才能做到这一点?。提前谢谢。
答案 0 :(得分:13)
您可以使用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;
尝试此操作,获取扩展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;