我正在尝试提取电话号码的前十位数,最后以十位数(或更少)的数字结尾。 由于使用了特殊字符,我需要使用白名单,而不是黑名单。例如“á(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-无效的数字数据。
答案 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,