4

我在 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

我想要的是这样的:

7485
2764
3003
2620
6960
2229
3798

IBM DB2 9.5 版中有没有办法通过执行以下操作来删除/删除所有这些非数字字母:

SELECT replace(DATA, --somekind of regular expression--, '') FROM TABLE_A

或任何其他方式?

这个问题来自这个问题

4

8 回答 8

5

正如另一个问题中所建议的那样,TRANSLATE功能可能会有所帮助。例如,试试这个:

select translate('Nowshak 7,485 m','','Nowshakm,') from sysibm.sysdummy1;

回报:

7 485

可能只需稍作调整,您就可以将其变为您想要的样子……在函数的第三个参数中,您只需要指定整个字母表。有点难看,但它会起作用。

于 2009-02-27T21:53:01.417 回答
4

一种简单的方法是使用 TRANSLATE(value, replacewith, replacelist) 函数。它将列表(第三个参数)中的所有字符替换为第二个参数中的值。

您可以利用它从根本上擦除字符串中的所有非数字字符,包括空格。

只需使第三个参数中的列表包含您可能看到的所有可能不想要的字符。将它们转换为空白空间,您最终只会得到您想要的字符,基本上会删除不需要的字符。

注意:我包括了所有常见的符号(非字母数字),以帮助其他可能具有比您的示例更多种类的字符值的人。

Select 
   TRANSLATE(UCASE(CHAR_COLUMN),'',
            'ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()-=+/\{}[];:.,<>? ')
FROM TABLE_A

更简单:对于您的特定值集,由于可能的字符集要小得多,您可以将替换列表修剪为:

Select 
   TRANSLATE(UCASE(CHAR_COLUMN),'','ABCDEFGHIJKLMNOPQRSTUVWXYZ(), ')
FROM TABLE_A

注意:CHAR_COLUMN 上的“UCASE”不是必需的,但通过消除包含所有小写字母字符的需要来简化此表达式是一个很好的增强。

TRANSLATE(CHAR_COLUMN,'',
      'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!@#$%^&*()-=+/\{}[];:.,<>? ')
于 2014-04-11T20:42:29.587 回答
4

由于上面的许多答案,您的最佳方法是使用 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)
于 2016-06-07T17:13:31.513 回答
1

只需使用@Darryls99 并将其变成 UDF

CREATE OR REPLACE FUNCTION REMOVE_ALLBUT(in_string VARCHAR(32000), characters_to_remote VARCHAR(32000))
RETURNS VARCHAR(32000)
LANGUAGE SQL CONTAINS SQL DETERMINISTIC NO EXTERNAL ACTION
RETURN
TRANSLATE(in_string,'',TRANSLATE(in_string,'',characters_to_remote,''),'')
;

像这样使用

select DB_REMOVE_ALLBUT(s,'1234567890')
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'
      ) t(s);

返回

 1
 ----
 7485
 2764
 3003
 2620
 6960
 2229
 3798
于 2018-09-12T22:42:22.630 回答
0

脏字符串可以是这样的:'qwerty12453lala<<>777*9'

我们需要清除字符串并只保留数字。

我们可以使用 TRANSLATE 函数删除任何多余的字符,但有一个问题:第 3 个参数的值太长且丑陋。像这样的东西:

VALUES
(
TRANSLATE( UPPER('qwerty12453lala<<>777*9'), '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()-=+/\{}[];:.,<>? ')
)

所以,这不是很方便。

我的想法是 - 使用 TRANSLATE 功能 2 次(一次在另一次内):

  • 计算第 3 个参数作为替换符号的特定列表
  • 使用此计算参数第二次使用 TRANSLATE 函数替换多余的符号

让我在这里用代码告诉你:

VALUES
( 
  REPLACE --Remove spaces from result
  (  
    TRANSLATE
    (
      UPPER( 'qwerty12453lala<<>777*9')
    , ' '
    , TRANSLATE( UPPER( 'qwerty12453lala<<>777*9') , ' ' , '0123456789')-- This is calculation of 3-th param, it contains only NOT digital characters, like 'QWERTYLALA<<>*'
    )
  , ' '
  , ''  
  )  
)    

结果必须是这样的:124537779

在 SELECT 语句的情况下,它将是这样的:

SELECT REPLACE
       (
         TRANSLATE( UPPER(T.DIRTY_FIELD), ' ', TRANSLATE(UPPER(T.DIRTY_FIELD), '', '1234567890' ) )
       , ' '
       , ''
       )
  FROM SOMETABLE T
于 2018-10-27T13:09:37.857 回答
0

所有的适当组合
select replace(translate(dirty,' ','ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!@#$%^&*()-=+/{}[];:.,<>?' ), ' ','') as clean

于 2020-12-24T17:07:32.557 回答
-1

IBM DB2 9.5 版中有没有办法通过执行以下操作来删除/删除所有这些非数字字母:

SELECT replace(DATA, --somekind of regular expression--, '') FROM TABLE_A

或任何其他方式?

不可以。您必须创建一个用户定义函数或以您的宿主应用程序的语言实现它。

于 2009-02-27T21:16:40.727 回答
-1

下面的语句将从任何“字符串值”中删除非字母数字字符,并在传递零长度字符串值时阻止 SQLSTATE 消息 42815。

SELECT REPLACE(TRANSLATE(string-value || '|',
                        '||||||||||||||||||||||||||||||||',
                        '`¬!"£$%^&*()_-+={[}]:;@~#,<>.?/'''),'|','')
FROM SYSIBM.SYSDUMMY1;
于 2014-12-08T12:12:20.790 回答