2009-02-27 35 views
2

假設有一個包含2列 - ID(INT),DATA(VARCHAR(100))的表「A」。 執行「選擇數據從」結果表中的樣子:如何從SQL結果中提取數字數據

DATA 
--------------------- 
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 
// the DATA continues... 
--------------------- 

我怎麼能只提取使用某種字符串處理函數中的SELECT SQL查詢中的數字數據,以便從修改的選擇結果看起來像這樣:

DATA (in INTEGER - not varchar) 
--------------------- 
7485 
2764 
3003 
2620 
6960 
2229 
3798 
// the DATA in INTEGER continues... 
--------------------- 

順便說一句,如果這可以在單個SQL語句中完成將是最好的。 (我使用的IBM DB2版本9.5)

謝謝:)

+0

您使用的平臺是? – Quassnoi 2009-02-27 19:15:21

+0

IBM DB2版本9.5(原生支持XML存儲的新版本) – natch3z 2009-02-27 19:24:54

回答

2

Oracle

SELECT TO_NUMBER(REGEXP_REPLACE(data, '[^0-9]', '')) 
FROM a 

PostgreSQL

SELECT CAST(REGEXP_REPLACE(data, '[^0-9]', '', 'g') AS INTEGER) 
FROM a 

MS SQL ServerDB2,你需要創建UDF的正則表達式和這樣的查詢。

查看鏈接瞭解更多詳情。

+0

對不起。我忘了提及我正在使用DB2 9.5版本。 – natch3z 2009-02-27 19:20:48

+0

從來不知道你可以在sql + 1中使用正則表達式 – 2009-02-27 19:22:13

2

在DB2上進行快速搜索時,我可以找到的最佳內置函數是Translate它允許您指定要更改爲其他字符的字符列表。這是不理想的,但你可以指定每個字符,你想刪除,也就是說,每個非數字字符可用...

(是的,這是一個很長的名單,一個很長的名單,這就是爲什麼我說它不是理想的)

翻譯( '數據', 'ABC ... XYZ,/ \ <> |?[等等]','「)

或者您需要創建用戶定義的功能來搜索號碼。這有幾個選擇。

  1. 檢查每個字符一個接一個,並保持它只有當它是一個數字。

  2. 如果你知道前面的數量和接下來的數,你可以搜索那些和保持什麼是介於兩者之間......

-1

要闡述民主黨的suggeston,我有辦法使用的是一個標量用戶定義函數(UDF),它接受一個字母數字字符串並遞歸迭代字符串(每次迭代一個字節)並抑制輸出中的非數字字符。遞歸表達式將在每次迭代中生成一行,但只保留最後一行並返回給調用應用程序。

4

我知道這個線程是舊的,而OP不需要這個答案,但是我必須從這個線程和其他線程中得出一些提示。他們似乎都錯過了確切的答案。

執行此操作的簡單方法是將所有不需要的字符轉換爲單個字符,然後將REPLACE表示爲帶空字符串的單個字符。

DATA = 'Nowshak 7,485 m' 

# removes all characters, leaving only numbers 
REPLACE(TRANSLATE(TRIM(DATA), '_____________________________________________________________________________________________', ' abcdefghijklmnopqrstuvwzyaABCDEFGHIJKLMNOPQRSTUVWXYZ`[email protected]#$%^&*()-_=+\|[]{};:",.<>/?'), '_', '') 
=> '7485' 

以分解TRANSLATE命令:

TRANSLATE(FIELD or String, <to characters>, <from characters>) 

例如

DATA = 'Sample by John' 

TRANSLATE(DATA, 'XYZ', 'abc') 
=> a becomes X, b becomes Y, c becomes Z 
=> 'SXmple Yy John' 

**注意:我不能說性能或版本兼容性。我在DB2的9.x版本上,並且是新技術。希望這可以幫助某人。