我在DATA列(varchar)中有一些数据,如下所示:
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
Run Code Online (Sandbox Code Playgroud)
我想要的是:
7485
2764
3003
2620
6960
2229
3798
Run Code Online (Sandbox Code Playgroud)
IBM DB2 9.5版中是否可以通过执行以下操作来除去/删除所有这些非数字字母:
SELECT replace(DATA, --somekind of regular expression--, '') FROM TABLE_A
Run Code Online (Sandbox Code Playgroud)
或其他方式?
这个问题来自这个问题。
正如另一个问题所建议的那样,TRANSLATE函数可能会有所帮助。例如,尝试以下操作:
select translate('Nowshak 7,485 m','','Nowshakm,') from sysibm.sysdummy1;
Run Code Online (Sandbox Code Playgroud)
返回值:
7 485
Run Code Online (Sandbox Code Playgroud)
稍加调整,就可以达到所需的效果……在函数的第三个参数中,您只需指定整个字母即可。有点丑陋,但可以正常工作。
实现此目的的一种简单方法是使用 TRANSLATE(value, Replacewith, Replacelist) 函数。它将列表(第三个参数)中的所有字符替换为第二个参数中的值。
您可以利用它从本质上删除字符串中的所有非数字字符,包括空格。
只需使第三个参数中的列表包含您可能不想要的所有可能的字符。将它们转换为空白,最终您将得到您想要的字符,基本上删除了不需要的字符。
注意:我包含了所有常见符号(非字母数字),以便其他人的利益可能比您的示例具有更多种类的字符值。
Select
TRANSLATE(UCASE(CHAR_COLUMN),'',
'ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()-=+/\{}[];:.,<>? ')
FROM TABLE_A
Run Code Online (Sandbox Code Playgroud)
更简单地说:对于您的特定值集,由于可能的字符集要小得多,您可以将替换列表修剪为:
Select
TRANSLATE(UCASE(CHAR_COLUMN),'','ABCDEFGHIJKLMNOPQRSTUVWXYZ(), ')
FROM TABLE_A
Run Code Online (Sandbox Code Playgroud)
注意:CHAR_COLUMN 上的“UCASE”不是必需的,但通过消除包含所有小写字母字符的需要来简化此表达式是一个很好的增强。
TRANSLATE(CHAR_COLUMN,'',
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!@#$%^&*()-=+/\{}[];:.,<>? ')
Run Code Online (Sandbox Code Playgroud)
正如上面的许多答案一样,您最好的方法是使用 TRANSLATE 函数。但是,这种方法有所不同,因为您可以将所需的字符列入白名单,而不是将不需要的字符列入黑名单。我们可以通过使用 TRANSLATE 函数两次来做到这一点。我们将使用内部翻译来生成要为外部翻译的参数删除的字符列表。
select TRANSLATE(dirty,'',TRANSLATE(dirty,'','1234567890',''),'') as clean
from (Values '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'
) as temp(dirty)
Run Code Online (Sandbox Code Playgroud)