去除非数字-SQL0171函数TRANSLATE的参数无效

时间:2019-04-02 21:06:13

标签: sql db2

我正在尝试提取电话号码的前十位数,最后以十位数(或更少)的数字结尾。 由于使用了特殊字符,我需要使用白名单,而不是黑名单。例如“á(123)555-4567免费电话:á(891)0”必须变为1235554567。

我正在尝试使用https://stackoverflow.com/a/37685384

但是,当我尝试使用此功能时:

TRANSLATE(SFCONTACT.PHONE,'',TRANSLATE(SFCONTACT.PHONE,'','1234567890',''),'') as clean

我明白了

  

消息:[SQL0171]函数TRANSLATE的参数04无效。

其中一条评论说,使用空格而不是空字符串将其删除。但是,对我来说,尝试:

TRANSLATE(SFCONTACT.PHONE,' ',TRANSLATE(SFCONTACT.PHONE,' ','1234567890',' '),' ') as clean

给予:

  

消息:[SQL0171]函数TRANSLATE的参数03无效。

我该怎么做?

运行IBM版本V7R1M0的AS400 DB2

编辑(不确定这是否应作为单独的问题)

我按照建议尝试了此操作

SUBSTR(REGEXP_REPLACE(PHONE, '[\D]', ''),1,10) AS MAINPHONE,

起初它似乎起作用;我能够创建一个视图BBICNTMIG

但是,当我尝试使用该视图插入表中时:

INSERT INTO AMMLIBC.BBICONTACT
(COMPANY,CUSNO,SHIPTO,HONORIFICFK,FIRSTNAME,LASTNAME,EMAIL,MAINPHONE,TYPEFK,PROSPECTFK,CREATEDBY,CREATEDAT)
SELECT COMPANY,CUSNO,SHIPTO,HONORIFICFK,FIRSTNAME,LASTNAME,EMAIL,MAINPHONE,TYPEFK,PROSPECTFK,CREATEDBY,CREATEDAT
FROM AMMLIBC.BBICNTMIG

它给出:

  

消息:[SQL0420] CAST参数中的字符无效。原因。 。 。 。 。 :CAST函数的参数中的字符不正确。恢复。 。 。 :将结果数据类型更改为可识别CAST参数中字符的字符,或将参数更改为包含结果数据类型值的有效表示形式。重试该请求。

如果我从插入内容中删除电话号码(取默认值null代替),则INSERT成功,因此我知道是导致此问题的电话号码。

目标表中的列类型为NUMERIC(10,0)。我尝试使用它,但没有任何改变:

CAST(SUBSTR(REGEXP_REPLACE(PHONE, '[\D]', ''),1,10) AS NUMERIC(10,0)) AS MAINPHONE,

更多信息:

我尝试将字符转换为char,然后再转换为数值。没有变化。

我尝试添加where子句(“ mainphone为null”和“ mainphone不为null”都这样做),并且错误消息更改为:

  

消息:[SQL0802]数据转换或数据映射错误。原因。 。 。 。 。 :发生错误类型6。 [...] 6-无效的数字数据。

3 个答案:

答案 0 :(得分:2)

TRANSLATE函数对于非ASCII字符无法正常工作。
请改用以下内容:

SELECT substr(
--  xmlcast(xmlquery('fn:replace($s, "[^\d]", "")' passing PHONE  as "s") as varchar(4000)) -- DB2 for LUW
regexp_replace(PHONE, '[^\d]', '') -- DB2 for LUW 11.1 & DB2 for IBM i
, 1, 10)
FROM TABLE(VALUES 
  'á(123) 555-4567 Toll Free:á(891) 0'
, 'á(123) 555-'
) SFCONTACT(PHONE);

答案 1 :(得分:0)

Db2的平台和版本很重要...

例如,

Db2 for i 7.2给了我

  

原因。 。 。 。 。 :在功能TRANSLATE中指定的参数3不适用于原因码1。原因码及其含义如下:
       1-参数必须是字符串常量。
       2-参数必须是整数常量。
       3-参数必须为数字常量。
       4-参数的长度太长。
       5-参数值超出范围。
       6-参数必须是有效的CCSID。
       7-参数不能是参数标记。
       8-内置函数不支持参数的数据类型。
       9-参数不安全,因此无法使用有效的列掩码引用列。
   恢复。 。 。 :有关功能的更多信息,请参阅IBM i信息中心一书http://www.ibm.com/systems/i/infocenter/中“数据库”类别中的“ DB2 for IBM i SQL参考参考”主题集合。更正为该功能指定的参数。重试该请求。

答案 2 :(得分:0)

使用“仅先检查_行”和二进制搜索,我发现了问题。

它试图解析的电话号码是“请核实联系方式和电子邮件”。除去数字后,它变成空字符串...不能很好地转换为NUMERIC(10,0)。

因此,这解决了问题:

CASE
    WHEN TRIM(REGEXP_REPLACE(PHONE, '[\D]', '')) = '' THEN NULL
    ELSE CAST(SUBSTR(REGEXP_REPLACE(PHONE, '[\D]', ''),1,10) AS NUMERIC(10,0))
END AS MAINPHONE,