2009-02-27 168 views
2

我有個數據列(VARCHAR)的一些數據,看起來像這樣:如何刪除DB2中的所有非數字字母

Nowshak 7,485 m 
Maja e Korabit (Golem Korab) 2,764 m 
Tahat 3,003 m 
Morro de Moco 2,620 m 
Cerro Aconcagua 6,960 m (located in the northwestern corner of the province of Mendoza) 
Mount Kosciuszko 2,229 m 
Grossglockner 3,798 m 

我想是這樣的:

7485 
2764 
3003 
2620 
6960 
2229 
3798 

是在IBM DB2 9.5版中有一種方法可以通過這樣的方式刪除/刪除所有這些非數字字母:

SELECT replace(DATA, --somekind of regular expression--, '') FROM TABLE_A 

或其他方式?

此問題源於this question

回答

0

是否有在IBM DB2版本的方法9.5 刪除/做這樣的事情刪除所有非數字字母 :

選擇替換(數據,--somekind的 定期expression- - ,'')FROM TABLE_A

或其他方式?

不需要。您必須創建一個User Defined Function或以您的主機應用程序的語言實現它。

3

正如另一個問題所建議的,TRANSLATE函數可能會有所幫助。例如,試試這個:

select translate('Nowshak 7,485 m','','Nowshakm,') from sysibm.sysdummy1; 

返回:

7 485 

也許稍加調整就可以得到它你想要的......在函數的第三個參數,你只需要指定整個字母表。有點醜但它會起作用。

+2

然後你就可以使用[REPLACE](http://publib.boulder.ibm.com/infocenter/db2luw/v9/index.jsp?topic=%2Fcom.ibm.db2.udb.admin。 doc%2Fdoc%2Fr0000843.htm)去掉空格,如果你想:從sysibm中選擇replace(translate('Nowshak 7,485 m','','Nowshakm'','',''))。 sysdummy1` – Andrew 2014-04-11 20:49:22

+0

實際上,如果他使用_empty_字符串作爲替換,他不需要進行第二輪。 – 2014-04-11 21:46:24

2

完成該操作的一個簡單方法是使用TRANSLATE(value,replacewith,replacelist)函數。它將列表中的所有字符(第三個參數)替換爲第二個參數中的值。

你可以利用它從本質上擦除字符串中的所有非數字字符,包括空格。

只要讓第三個參數中的列表包含所有可能看到的不需要的字符。把它們翻譯成一個空白的空間,最終只需要你想要的字符,從本質上抹去不需要的字符。

注意:爲了其他可能具有比您的示例更大的字符值的其他字符值,我包含了所有常用符號(非字母數字)。

Select 
    TRANSLATE(UCASE(CHAR_COLUMN),'', 
      '[email protected]#$%^&*()-=+/\{}[];:.,<>? ') 
FROM TABLE_A 

更簡單地說:爲了您的特別設定值,因爲有一組小得多的可能的字符,你可以下來修剪更換名單如下:

Select 
    TRANSLATE(UCASE(CHAR_COLUMN),'','ABCDEFGHIJKLMNOPQRSTUVWXYZ(), ') 
FROM TABLE_A 

注意:「UCASE」在CHAR_COLUMN上是沒有必要的,但是通過消除包含所有小寫字母字符的需要來簡化這個表達式是一個很好的增強。

TRANSLATE(CHAR_COLUMN,'', 
     '[email protected]#$%^&*()-=+/\{}[];:.,<>? ') 
-1

下面的語句將來自任何「字串值」除去非字母數字字符和當一個零長度字符串值被傳遞防止SQLSTATE消息42815。

SELECT REPLACE(TRANSLATE(string-value || '|', 
         '||||||||||||||||||||||||||||||||', 
         '`¬!"£$%^&*()_-+={[}]:;@~#,<>.?/'''),'|','') 
FROM SYSIBM.SYSDUMMY1; 
1

由於許多以上最佳方法的答案是使用TRANSLATE函數。然而,這種方法是不同的,因爲你可以白名單列出你想要的字符而不是黑名單列出你不想要的字符。我們可以通過兩次使用TRANSLATE函數來做到這一點。我們將使用內部翻譯來生成要刪除的外部翻譯參數的字符列表。

select TRANSLATE(dirty,'',TRANSLATE(dirty,'','1234567890',''),'') as clean 
from (Values 'Nowshak 7,485 m' 
      ,'Maja e Korabit (Golem Korab) 2,764 m' 
      ,'Tahat 3,003 m','Morro de Moco 2,620 m' 
      ,'Cerro Aconcagua 6,960 m (located in the northwestern corner of the province of Mendoza)' 
      ,'Mount Kosciuszko 2,229 m','Grossglockner 3,798 m' 
    ) as temp(dirty) 
相關問題