2010-12-21 25 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')雙;