如何从 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 Server
和DB2
中,您需要为正则表达式和查询创建UDF
。
查看链接了解更多详情。
【讨论】:
对不起。我忘了说我使用的是 DB2 9.5 版。 从来不知道你可以在 sql +1 中使用正则表达式 你可以为 MSSQL Server 发布一个吗?【参考方案3】:在线快速搜索 DB2 我能找到的最好的内置函数是Translate 它让您可以指定要更改为其他字符的字符列表。这并不理想,但是您可以指定要删除的每个字符,即每个可用的非数字字符...
(是的,这是一个很长的列表,很长的列表,这就是为什么我说它不理想)
TRANSLATE('data', 'abc...XYZ,./\?|[等等]', ' ')
或者,您需要创建一个用户定义的函数来搜索号码。有几个替代方案。
逐一检查每个字符,仅当它是数字时才保留。
如果您知道数字前面的内容和数字后面的内容,您可以搜索它们并保留中间的内容...
【讨论】:
【参考方案4】:为了详细说明 Dems 的建议,我使用的方法是一个标量用户定义函数 (UDF),它接受一个字母数字字符串并递归遍历该字符串(每次迭代一个字节)并抑制非数字字符输出。递归表达式每次迭代都会生成一行,但只保留最后一行并将其返回给调用应用程序。
【讨论】:
这太慢了。以上是关于如何从 SQL 结果中提取数值数据的主要内容,如果未能解决你的问题,请参考以下文章