【问题标题】:How to delete all non-numerical letters in db2如何删除db2中的所有非数字字母
【发布时间】:2009-02-27 20:57:15
【问题描述】:

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

【问题讨论】:

  • 作为记录,在 DB2 11.1 上,您可以简单地执行此操作 SELECT REGEXP_REPLACE(data,'[^0-9]','') FROM TABLE_A

标签: sql db2


【解决方案1】:

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

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

返回:

7 485

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

【讨论】:

  • 然后你可以使用REPLACE去除空格,如果你想:select replace(translate('Nowshak 7,485 m','','Nowshakm,'),' ','') from sysibm.sysdummy1
  • 其实如果他用一个empty字符串作为替换,他就不需要再做第二轮了。
  • 由于某种原因,当我使用带有空替换字符串的 TRANSLATE 时出现错误:函数 TRANSLATE 的参数 02 无效。所以我也需要使用 REPLACE
【解决方案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!@#$%^&*()-=+/\{}[];:.,<>? ')

【讨论】:

  • 这与现有答案基本相同(您刚刚列出了所有相关字符)。你还能做些什么来让你的产品更具差异化?
  • 感谢 C-M 的反馈。我添加了一些细节。希望对您有所帮助!
  • 你应该有 UCASE 然后你就不需要小写字母了。
  • 我喜欢这样,@Hogan!我会将其添加到答案中。这是可行的,因为它不会影响我们的目标字符,但请记住,如果它用于隔离 alpha 字符,您将不希望 UCASE 传入的字符串。
【解决方案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)

【讨论】:

    【解决方案4】:

    只需将@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
    

    【讨论】:

      【解决方案5】:

      脏字符串可以是这样的:'qwerty12453lala777*9'

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

      我们可以使用 TRANSLATE 功能删除任何多余的字符, 但是有一个问题:第三个参数的值太长太丑了。 像这样的:

      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
      

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

          IBM DB2 9.5 版中有没有办法 删除/删除所有那些非数字 做这样的事情来写信:

          选择替换(数据,--somekind of 正则表达式--, '') FROM TABLE_A

          还是其他方式?

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

          【讨论】:

            【解决方案8】:

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2013-01-19
              • 1970-01-01
              • 1970-01-01
              • 2016-01-14
              • 1970-01-01
              • 1970-01-01
              • 2012-07-04
              相关资源
              最近更新 更多