如何删除db2中的所有非数字字母

时间:2009-02-27 20:57:15

标签: sql db2

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

或其他任何方式?

这个问题来自this question

8 个答案:

答案 0 :(得分:5)

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

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

返回:

7 485

可能稍微调整一下你就可以得到你想要的东西......在函数的第三个参数中你只需要指定整个字母表。有点丑,但它会起作用。

答案 1 :(得分:3)

正如您最好的方法之上的许多答案都是使用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)

答案 2 :(得分:2)

实现这一目标的一种简单方法是使用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!@#$%^&*()-=+/\{}[];:.,<>? ')

答案 3 :(得分: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

答案 4 :(得分: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

答案 5 :(得分:0)

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

答案 6 :(得分:-1)

  

IBM DB2 V9.5中是否有一种方法   删除/删除所有非数字   通过做这样的事情来写信:

     

SELECT replace(DATA, - somekind of   正则表达式 - ,'')FROM TABLE_A

     

或其他任何方式?

没有。您必须创建User Defined Function或以您的宿主应用程序的语言实现它。

答案 7 :(得分:-1)

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

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