在oracle中,如何查找列是否包含任何非英语字母?
我有一个要求,打印问号,如果一个领域包含任何外国(非英语)字母。例如,我需要实现以下输出 我考虑使用oracle函数,检查是否存在任何外来字符&随后,使用问号替换 不幸的是,我意识到甲骨文。我的意图是使用类似于“\p{L}^[a-Za-z]”的REXEXP,但不支持REGEXP_INSTR。我还有别的办法可以做到这一点吗 以下是一些示例数据:在oracle中,如何查找列是否包含任何非英语字母?,oracle,unicode,Oracle,Unicode,我有一个要求,打印问号,如果一个领域包含任何外国(非英语)字母。例如,我需要实现以下输出 我考虑使用oracle函数,检查是否存在任何外来字符&随后,使用问号替换 不幸的是,我意识到甲骨文。我的意图是使用类似于“\p{L}^[a-Za-z]”的REXEXP,但不支持REGEXP_INSTR。我还有别的办法可以做到这一点吗 以下是一些示例数据: select name from (select '#Tag Company' name from dual union select 'Company
select name from
(select '#Tag Company' name from dual union
select 'Company' name from dual union
select '中文' name from dual);
在Kaushik Nayak的评论的帮助下,我成功地解决了这个问题,如下所示
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);
输出:
REGEXP\u xxx
函数支持unicode字符,例如:
select regexp_replace('中文', '中', '文') from dual;
REGEXP_REPLACE('中文','中','文')
----------------------------
文文
1 row selected.
您可能在使用某些欧洲字符进行转换时遇到问题,例如:
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字符。请先尝试使用convert函数,然后使用regexp。非常感谢Kaushik,当运行convert(name,'US7ASCII','UTF8')时,我看到外来字符的问号。现在,这只是一个比较的问题。你可能想看看“请不要在你的问题中放入图像”,复制/粘贴文本。谢谢你尝试。然而,我在这里只是一个学习者,不是专家。最好参考专家的解决方案。我只是从我记得的某件事上发表了评论。再次感谢。非常感谢你详细的回答。此解决方案在许多情况下都非常清晰和准确。然而,基于转换的解决方案也适用于我的需求,即用替换整个字符串?如果它是非ASCII的,因为它稍后会比较原始和转换的字符串。测试时,我意识到REGEXP.*[^-~].*也会过滤ASCII。意思是从dual中选择REGEXP_REPLACE('a1','.[^-~].','?');将返回不正确的“?”。