假设有一个包含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版)
谢谢:)
答案 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 Server
和DB2
中,您需要为正则表达式创建UDF
,并像这样进行查询。
有关详细信息,请参阅链接。
答案 2 :(得分:2)
在线快速搜索DB2我能找到的最好的内置函数是Translate它允许您指定要更改为其他字符的字符列表。它并不理想,但您可以指定要删除的每个字符,即每个可用的非数字字符......
(是的,这是一个很长的清单,一个很长的清单,这就是我说它不理想的原因)
TRANSLATE('data','abc ... XYZ,。/ \&lt;&gt;?| [等等]'','')
或者,您需要创建用户定义的函数来搜索数字。有一些替代方案。
逐个检查每个字符,只有在数字为数字时才保留。
如果您知道数字前面的数字以及数字后面的内容,您可以搜索这些内容并保留其中的内容...
答案 3 :(得分:-1)
详细说明Dems的建议,我使用的方法是标量用户定义函数(UDF),它接受一个字母数字字符串并递归遍历字符串(每次迭代一个字节)并抑制非数字字符输出。递归表达式将在每次迭代时生成一行,但只保留最后一行并将其返回给调用应用程序。