如何从SQL结果中提取数值数据

时间:2009-02-27 19:09:16

标签: sql db2

假设有一个包含2列的表“A” - ID(INT),DATA(VARCHAR(100))。 执行“SELECT DATA FROM A”会导致表格如下:

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查询中使用某种字符串处理函数仅提取数值数据,以便修改后的SELECT的结果如下所示:

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

顺便说一句,如果可以在单个SQL语句中完成,那将是最好的。 (我使用的是IBM DB2 9.5版)

谢谢:)

4 个答案:

答案 0 :(得分:4)

我知道这个线程已经老了,OP不需要答案,但是我必须从这个和其他线程中得到一些提示。他们似乎都错过了确切的答案。

执行此操作的简单方法是将TRANSLATE所有不需要的字符添加到单个字符,然后REPLACE该字符为空字符串。{/ p>

DATA = 'Nowshak 7,485 m'

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

分解TRANSLATE命令:

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

e.g。

DATA = 'Sample by John'

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

**注意:我不能说性能或版本兼容性。我使用的是9.x版本的DB2,并且是该技术的新手。希望这有助于某人。

答案 1 :(得分: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,并像这样进行查询。

有关详细信息,请参阅链接。

答案 2 :(得分:2)

在线快速搜索DB2我能找到的最好的内置函数是Translate它允许您指定要更改为其他字符的字符列表。它并不理想,但您可以指定要删除的每个字符,即每个可用的非数字字符......

(是的,这是一个很长的清单,一个很长的清单,这就是我说它不理想的原因)

TRANSLATE('data','abc ... XYZ,。/ \&lt;&gt;?| [等等]'','')

或者,您需要创建用户定义的函数来搜索数字。有一些替代方案。

  1. 逐个检查每个字符,只有在数字为数字时才保留。

  2. 如果您知道数字前面的数字以及数字后面的内容,您可以搜索这些内容并保留其中的内容...

答案 3 :(得分:-1)

详细说明Dems的建议,我使用的方法是标量用户定义函数(UDF),它接受一个字母数字字符串并递归遍历字符串(每次迭代一个字节)并抑制非数字字符输出。递归表达式将在每次迭代时生成一行,但只保留最后一行并将其返回给调用应用程序。