如果字段包含任何外国(非英语)字母,我需要打印问号。例如,我需要实现以下输出。
我想过使用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);
答案 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
然后您的客户端将自动替换?
答案 1 :(得分:0)
在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);
输出: