3

假设有一个包含 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

4 回答 4

4

我知道这个线程很旧,并且 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,并且是这项技术的新手。希望这可以帮助某人。

于 2011-08-26T00:27:51.443 回答
2

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

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

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

或者,您需要创建一个用户定义的函数来搜索号码。有几种选择。

  1. 一个一个地检查每个字符,只有当它是数字时才保留它。

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

于 2009-02-27T21:40:49.247 回答
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 ServerandDB2中,您需要UDF像这样为正则表达式和查询创建 's。

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

于 2009-02-27T19:15:02.267 回答
-1

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

于 2009-06-19T03:50:17.003 回答