首页 > 解决方案 > db2 删除所有非字母数字,包括不可打印和特殊字符

问题描述

这听起来像是重复,但现有的解决方案不起作用。我需要从 varchar 字段中删除所有非字母数字。我正在使用以下内容,但并非在所有情况下都有效(它适用于菱形问号字符):

  select TRANSLATE(FIELDNAME, '?',
                 TRANSLATE(FIELDNAME , '', 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789')) 
   from TABLENAME

它所做的是内部翻译解析所有非字母数字字符,然后外部翻译将它们全部替换为“?”。这似乎适用于替换角色。但是,The second, third or fourth argument of the TRANSLATE scalar function is incorrect.根据 IBM 的预期,它会抛出:

The TRANSLATE scalar function does not allow replacement of a character by another character which is encoded using a different number of bytes. The second and third arguments of the TRANSLATE scalar function must end with correctly formed characters.

有没有办法解决这个问题?

编辑:@Paul Vernon 的解决方案似乎有效:

· 6005308      ??6005308
–6009908       ?6009908
–6011177       ?6011177
��6011183�� ??6011183??

标签: db2special-characterstranslate

解决方案


尝试regexp_replace(c,'[^\w\d]','')regexp_replace(c,'[^a-zA-Z\d]','')

例如

select regexp_replace(c,'[^a-zA-Z\d]','') from table(values('AB_- C$£abc�$123£')) t(c)

返回

1
---------
ABCabc123

BTW 请注意,允许的正则表达式模式列在此页面上正则表达式控制字符

在集合之外,以下必须以反斜杠开头才能被视为文字

* ? + [ ( ) { } ^ $ | \ . /

在集合中,后面必须以反斜杠开头才能被视为文字

必须引用才能被视为文字的[ ] \ 字符是可能需要引用的字符,具体取决于上下文是- &


推荐阅读