2009-02-27 36 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版本上,并且是新技术。希望这可以帮助某人。