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

如何从SQL结果中提取数值数据,sql,db2,Sql,Db2,假设有一个表“a”有两列——ID(INT)、DATA(VARCHAR(100))。 在表中执行“从中选择数据”的结果如下所示: 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 pro

假设有一个表“a”有两列——ID(INT)、DATA(VARCHAR(100))。 在表中执行“从中选择数据”的结果如下所示:

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版)


谢谢:)

Oracle
中:

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

SELECT CAST(REGEXP_REPLACE(data, '[^0-9]', '', 'g') AS INTEGER)
FROM a
在和中,您需要为正则表达式和查询创建
UDF


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

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

(是的,这是一个很长的列表,一个很长的列表,这就是为什么我说它不理想的原因)

翻译('data','abc…XYZ,./\?|[等],'')

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

  • 逐个检查每个字符,仅当它是数字时才保留它

  • 如果你知道数字前的内容和数字后的内容,你可以搜索这些内容并保留介于两者之间的内容


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

    我知道这个线程很旧,OP不需要答案,但我必须从这个线程和其他线程得到一些提示来解决这个问题。他们似乎都没有找到确切的答案

    执行此操作的简单方法是
    将所有不需要的字符转换为单个字符,然后
    将该单个字符替换为空字符串

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


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

    对不起。我忘了提到我使用的是DB2 9.5版。我从来不知道您可以在sql+1中使用正则表达式。您可以为MSSQL Server发布一个正则表达式吗?IBM DB2 9.5版(本机支持XML存储的新版本)。这里不需要
    替换
    ,如果第一个参数是
    '
    ,它将删除所有这些字符。您还可以使用
    UPPER
    函数,这样就不必列出小写字符。@Hogan,
    TRANSLATE()
    要求第二个参数中的字符数与第三个参数中的字符数相同,因此需要
    REPLACE
    (至少在我的9.x版本的DB2上是这样)。另外,使用
    UPPER()
    也会起作用,并且确实简化了translate命令,但我不确定这是否总体上更有效。看看最后一个示例,它删除了
    u
    您使用的是9.7之前的版本吗?:)因此,
    TRANSLATE(x,'1234567890','1234567890…)
    可以很好地工作,速度非常慢。
    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'