我想做的是:
SELECT REGEXP_REPLACE(COLUMN,'[^[:ascii:]],'')
但 Oracle 没有实现 [:ascii:] 字符类。
有没有简单的方法可以做到我想要做的事情?
SELECT REGEXP_REPLACE(COLUMN,'[^[:ascii:]],'')
但 Oracle 没有实现 [:ascii:] 字符类。
有没有简单的方法可以做到我想要做的事情?
我遇到过类似的问题,曾经在这里博客中写过关于它的内容。 我从匹配字母数字的正则表达式开始,然后加入了几个我喜欢的基本标点符号:
select dump(a,1016), a, b
from
(select regexp_replace(COLUMN,'[[:alnum:]/''%()> -.:=;[]','') a,
COLUMN b
from TABLE)
where a is not null
order by a;
我使用了1016变体的dump函数来提取我想要替换的十六进制字符,然后可以在utl_raw.cast_to_varchar2中使用。
-- To detect
select 1 from dual
where regexp_like(trim('xx test text æ¸¬è© ¦ “xmx” number²'),'['||chr(128)||'-'||chr(255)||']','in')
-- To strip out
select regexp_replace(trim('xx test text æ¸¬è© ¦ “xmxmx” number²'),'['||chr(128)||'-'||chr(255)||']','',1,0,'in')
from dual
REGEXP_REPLACE (COLUMN,'[^' || CHR (32) || '-' || CHR (127) || ']', ' '))
我在一个自动换行的函数中使用它。偶尔会有嵌入的NewLine/NL/CHR(10)/0A在输入的文本中,这会导致问题。
regexp_like(column, '[A-Z]')
Oracle的正则表达式引擎也会匹配拉丁-1范围内的某些字符:这适用于所有看起来类似于ASCII字符的字符,例如Ä->A,Ö->O,Ü->U等,因此[A-Z]不是您从其他环境(如Perl)中所知道的。
与其纠结于正则表达式,不如在字符集升级之前将数据类型更改为NVARCHAR2。
另一种方法:而不是削减字段内容的一部分,您可以尝试使用SOUNDEX函数,前提是您的数据库仅包含欧洲字符(即拉丁-1字符)。或者您可以编写一个函数,将拉丁-1范围内的字符转换为外观相似的ASCII字符,例如
当转换为UTF-8后,当然只适用于超过4000字节的文本块。
Francisco Hayoz 给出的答案是最好的。如果 SQL 可以胜任,就不要使用 PL/SQL 函数。
以下是在 Oracle 11.2.03 中进行的简单测试。
select s
, regexp_replace(s,'[^'||chr(1)||'-'||chr(127)||']','') "rep ^1-127"
, dump(regexp_replace(s,'['||chr(127)||'-'||chr(225)||']','')) "rep 127-255"
from (
select listagg(c, '') within group (order by c) s
from (select 127+level l,chr(127+level) c from dual connect by level < 129))
"rep 127-255" 是
Typ=1 Len=30: 226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255
即,由于某些原因,此版本的Oracle不会替换char(226)及以上字符。 使用'[' || chr(127)||'-'||chr(225)||']' 将获得所需结果。 如果您需要替换其他字符,请将它们添加到上面的正则表达式中或者如果替换不同于''(空字符串),则使用嵌套的replace|regexp_replace。
做这个,它会起作用。
trim(replace(ntwk_slctor_key_txt, chr(0), ''))
SELECT est.clients_ref
,TRANSLATE (
est.clients_ref
, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890#$%^&*()_+-={}|[]:";<>?,./'
|| REPLACE (
TRANSLATE (
est.clients_ref
,'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890#$%^&*()_+-={}|[]:";<>?,./'
,'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
)
,'~'
)
,'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890#$%^&*()_+-={}|[]:";<>?,./'
)
clean_ref
从edms_staging_table est
ç
替换为c
等。丢弃整个字符比丢弃变音符号更糟糕。 - MSalters