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

l3zydbqr  于 2023-06-22  发布在  DB2
关注(0)|答案(9)|浏览(255)

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

hts6caw3

hts6caw31#

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

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

退货:

7 485

也许通过一点调整,你可以得到你想要的结果......在函数的第三个参数中,你只需要指定整个字母表。有点丑,但它会工作。

7cwmlq89

7cwmlq892#

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

yzckvree3#

由于上面的许多答案,您的最佳方法是使用翻译功能。然而,这种方法是不同的,因为你可以白色名单的字符,你想要,而不是黑名单的字符,你不想要。我们可以使用两次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)
nwlqm0z1

nwlqm0z14#

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

mutmk8jj5#

脏字符串可以是这样的:* 'qwerty12453lala <<>7779'
我们需要清除字符串,只保留数字。
我们可以使用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
jm2pwxwz

jm2pwxwz6#

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

3zwtqj6y

3zwtqj6y7#

使用spec_char(col 1,col 2,Col 3)作为(select Veh_Desc,Lic_plate,TRANSLATE(Lic_plate,'999999999999999999999999999999999999999999999999999999999999999999999999 ','ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz 1234567890')as clean_data from YourTableName)select * from spec_char where col3 <> '99999999'
这将给予你的车辆牌照包含特殊字符,即除A-Z和0-9。

lrpiutwd

lrpiutwd8#

在IBM DB2 9.5版本中是否有一种方法可以删除/删除所有非数字字母,方法如下:
SELECT replace(DATA,--somekind of regular expression--,'')FROM TABLE_A
或其他方式?
不可以。您必须创建一个User Defined Function,或者用主机应用程序的语言实现它。

nkcskrwz

nkcskrwz9#

下面的语句将从任何'string-value'中删除非字母数字字符,并在传递零长度string-value时防止SQLSTATE消息42815。

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

相关问题