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

Posted

技术标签:

【中文标题】如何从 SQL 结果中提取数值数据【英文标题】:How to extract numerical data from SQL result 【发布时间】:2009-02-27 19:09:15 【问题描述】:

假设有一个表“A”有 2 列 - 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 版)

谢谢:)

【问题讨论】:

IBM DB2 9.5版(原生支持XML存储的新版本) 【参考方案1】:

我知道这个线程很旧,OP 不需要答案,但我必须通过这个线程和其他线程的一些提示来解决这个问题。他们似乎都错过了确切的答案。

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

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

例如

DATA = 'Sample by John'

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

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

【讨论】:

这里不需要REPLACE,如果第一个参数是'',它将删除所有这些字符。您还可以使用UPPER 函数,这样您就不必列出小写字符。 @Hogan, TRANSLATE() 在第二个参数中要求的字符数与在第三个参数中相同,因此需要 REPLACE(至少在我的 9.x 版本的 DB2 上) .此外,UPPER() 的使用会起作用,并且确实简化了翻译命令,但我不确定这是否更有效。 看最后一个例子,它删除了u ibm.com/support/knowledgecenter/SSEPGG_9.7.0/… 你使用的是9.7之前的版本吗? :) 所以TRANSLATE(x, '1234567890', '1234567890....' ) 可以正常工作。【参考方案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

查看链接了解更多详情。

【讨论】:

对不起。我忘了说我使用的是 DB2 9.5 版。 从来不知道你可以在 sql +1 中使用正则表达式 你可以为 MSSQL Server 发布一个吗?【参考方案3】:

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

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

TRANSLATE('data', 'abc...XYZ,./\?|[等等]', ' ')

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

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

    如果您知道数字前面的内容和数字后面的内容,您可以搜索它们并保留中间的内容...

【讨论】:

【参考方案4】:

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

【讨论】:

这太慢了。

以上是关于如何从 SQL 结果中提取数值数据的主要内容,如果未能解决你的问题,请参考以下文章

sql中如何提取从数据库中所获得时间的年份

如何从 T-SQL 表中提取最新值

如何将系数值从逻辑回归中提取到 R 中的数据框中? [复制]

如何从 SQL 返回的结果中选择结果

如何从字符串中提取数值?

如何从 NSRange 中提取整数值?