在 Oracle SQL 中去除非英文字符

Posted

技术标签:

【中文标题】在 Oracle SQL 中去除非英文字符【英文标题】:Strip non English characters in Oracle SQL 【发布时间】:2020-11-30 17:39:00 【问题描述】:

我正在开发一个记录人名的系统。我们需要去除名称中的重音符号以适应遗留系统。一个这样的虚构示例是 RÃOUL TÉLITINO,我们需要将 Ã 转换为 A,将 É 转换为 E,依此类推。 我很难这样做。 信息

SELECT *
  FROM v$nls_parameters
WHERE parameter LIKE '%CHARACTERSET'

给予

**Parameter**:INLS_CHARACTERSET 
**Value**: AL32UTF8
   and
**Parameter**: NLS_NCHAR_CHARACTERSET     **Value**: AL16UTF16|

我尝试过的:

整理

select 'RÃOUL TÉLITINO' collate SQL_Latin1_General_Cp1251_CS_AS

但我明白了

ORA-12746: 无法识别的排序规则名称 "SQL_LATIN1_GENERAL_CP1251_CS_AS"

CONVERT()

第一次尝试

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

给出了理想的'JUAN ROMAN',但是

select CONVERT('RÃOUL TÉRK', 'US7ASCII') from dual;

错过了Ã,即:R?OUL TERK

第二次尝试

我尝试过的其他参数是AL16UTF16(但这不会改变输入字符串)和AL16UTF16AL24UTFFSSAL32UTF8,但是这些都转换为汉字。

【问题讨论】:

我不会完全在 SQL 中执行此操作,因为 SQL 不是文本处理系统。就个人而言,我会在 Linqpad 或类似工具中编写一个实用程序脚本,使用专用的文本处理库执行文本转换,然后发出批处理 UPDATE SQL_Latin1_General_Cp1251_CS_AS 是 MS SQL Server 排序规则名称,而不是 Oracle 排序规则名称。 这能回答你的问题吗? Remove accents from string in Oracle 【参考方案1】:

你试过 Translate() 吗?

translate(text,
'ÂÃÄÀÁÅÇÈÉÊËÌÍÎÏÑÒÓÔÕÖØÙÚÛÜÝŸàáâãäåçèéêëìíîïñòóôõöøùúûüýÿ',
'AAAAAACEEEEIIIINOOOOOOUUUUYYaaaaaaceeeeiiiinoooooouuuuyy')

【讨论】:

【参考方案2】:

试试translate 函数,它通过一次替换单个字符来用另一组字符替换字符串中的字符序列。

例如

select translate(WORD,'ÃÉÄ','ΑΕA') from dual

或者你自己的例子

select translate('JUAN ROMÄN', 'ÃÄ','AA') from dual;

【讨论】:

【参考方案3】:

除了翻译,你还可以使用正则表达式。下面的帖子可能对你有帮助。

Finding and removing non ascii characters from an Oracle Varchar2

【讨论】:

以上是关于在 Oracle SQL 中去除非英文字符的主要内容,如果未能解决你的问题,请参考以下文章

如何从字符串中去除非 ASCII 字符? (在 C# 中)

如何从 BigQuery 结果中去除非数字字符

oracle数组 拼到sql的in子句中去,比如String st=“A,B,G,H”这个字符串

oracle数组 拼到sql的in子句中去

oracle怎样将动态sql插到字段中去单引号里面包含单引号报错

sql server打不出英文下划线