2010-12-21 53 views
4

我有last_name列中的数据。oracle正则表达式替换(仅保留a-z)

这些数据来自于在线,有时用户正在复制粘贴word文档中的姓氏。当姓氏有单引号时,这是个问题。不知何故,单词文档中的单引号很奇怪。

我想在我的选择查询中编写一个oracle正则表达式替换,这样它将替换last_name列中的所有内容,但只保留(a-z或A-Z)。

这是可行的吗?

+3

如果姓氏是D'Angelo,会发生什么?你需要小心你的正则表达式。 – 2010-12-21 19:36:21

+0

是的,我想过。现在,我宁愿将它转换为DAngelo。这必须到位,直到我们开始在提交到数据库之前开始捕获它为止。 – 2010-12-21 19:38:15

回答

2

'怪怪'你的意思是它不是正常的单引号? Word有一些默认使用的非常愚蠢的字符(称为'Smart quotes(google)',它看起来有点像标准引号,但是在转换为ASCII时有不同的行为,例如UTF-8

他们在SQL中使用函数ASCIISTR进行选择,并以<backslash><4 digits>的形式查找子字符串(这适用于带有UTF-8和simialr字符的数据库,我不确定它是否在具有ASCII NLS参数的数据库中返回)

select asciistr(COLUMN) from table 

我用下面的代码删除它们在最近的一些工作,我一直在做

update jiraissue 
set summary = replace(asciistr(summary), '\2013','-') 
where asciistr(summary) like '%\2013%';`) 

HTH

+0

谢谢。我不知道asciistr函数。我不知道它是否是精明的报价,但它在oracle中显示为一个小方块。 – 2010-12-21 21:32:47

0

可以使用REGEXP_REPLACE运营商如:

select regexp_replace('foobar1000!!!!','[[:cntrl:]]|[[[:digit:]]|[[:punct:]]') from dual; 

REGEXP_REPLACE('FOOBAR1000!!!!','[[:CNTRL:]]|[[[:DIGIT:]]|[[:PUNCT:]]') 
----------------------------------------------------------------------- 
foobar 
+0

我喜欢regexp_replace的想法,但这会错过控制字符和空格等..我会去这样的: select regexp_replace('foo Bar1000 !!!!','[^ [:alpha:]] ')从双重; – Craig 2010-12-21 21:48:47

10

终于我这个去:

REGEXP_REPLACE(mbr_last_name,'[^a-zA-Z'']','') replaced_last_name 

我保持a到z A到Z和单引号

0

值得一看的CONVERT功能,它将做转换n在字符集之间。您可以转换为'纯文本'的7位ASCII字符以消除异常。

例如

选择转换从 ( 'EE', 'US7ASCII')双;