在oracle中,如何查找列是否包含任何非英文字母?

时间:2017-10-26 02:52:21

标签: oracle unicode

如果字段包含任何外国(非英语)字母,我需要打印问号。例如,我需要实现以下输出。

enter image description here

我想过使用oracle REGEXP_INSTR函数,检查是否存在任何外来字符&随后,使用CASE expression替换问号。

不幸的是,我意识到了oracle REGEXP_INSTR doesn’t support Unicode characters。我的意图是使用类似“\ p {L} ^ [A-Za-z]”的REXEXP,但\p{L}不支持REGEXP_INSTR。还有其他方法可以达到这个目的吗?

以下是一些示例数据:

select name from
(select '#Tag Company' name from dual union
select 'Company' name from dual union
select '中文' name from dual);

2 个答案:

答案 0 :(得分:1)

REGEXP_xxx函数支持unicode字符,例如:

select regexp_replace('中文', '中', '文') from dual;

REGEXP_REPLACE('中文','中','文')
----------------------------
文文                          
1 row selected.

CONVERT您可能遇到某些欧洲字符的问题,例如:

SELECT CONVERT('ä é ô', 'US7ASCII') FROM dual;

CONVERT('ÄÉÔ','US7ASCII')
----------------------------
a e o                    
1 row selected.

你知道,非英文字符(无论这意味着什么)不会被?替换。

如果您要求替换非ASCII字符,那么我推荐这个:

SELECT REGEXP_REPLACE('中文 aä eé oô', '[^ -~]', '?') FROM dual;

REGEXP_REPLACE('中文AÄEÉOÔ','[^-~]','?')
--------------------------------------
?? a? e? o?                           
1 row selected.

或者如果您必须使用单个问号替换整个字符串:

SELECT REGEXP_REPLACE('中文 aä eé oô', '.*[^ -~]+.*', '?') FROM dual;

REGEXP_REPLACE('中文AÄEÉOÔ','.*[^-~]+.*','?')
-----------------------------------------------
?                                         
1 row selected.

也许有一个更简单的解决方案。设置环境变量

set NLS_LANG=.US7ASCII

然后您的客户端将自动替换?

之前的任何非ASCII字符

答案 1 :(得分:0)

在Kaushik Nayak的评论的帮助下,我设法解决了这个问题如下。

  1. 使用CONVERT函数转换字符集。
  2. 比较原始字符串和转换字符串。
  3. 这是查询。

    select 
        name, 
        CONVERT(name, 'US7ASCII', 'UTF8') proc, 
        decode(name, CONVERT(name, 'US7ASCII', 'UTF8'), name, '?') name_proc from
    (select '#Tag Company' name from dual union
    select 'Company' name from dual union
    select '中文' name from dual);
    

    输出:

    enter image description here