Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
剥离非数字-函数TRANSLATE的SQL0171参数无效_Sql_Db2 - Fatal编程技术网

剥离非数字-函数TRANSLATE的SQL0171参数无效

剥离非数字-函数TRANSLATE的SQL0171参数无效,sql,db2,Sql,Db2,我试图提取一个电话号码的前10位数字,最后得到一个10位(或更少)的号码。 我需要使用白名单,而不是黑名单,因为已经使用了特殊字符。e、 g.“á(123)555-4567免费:á(891)0”必须变成1235554567 我正试着用它 但是,当我尝试使用此选项时: TRANSLATE(SFCONTACT.PHONE,'',TRANSLATE(SFCONTACT.PHONE,'','1234567890',''),'') as clean 我明白了 消息:[SQL0171]函数TRANSLAT

我试图提取一个电话号码的前10位数字,最后得到一个10位(或更少)的号码。 我需要使用白名单,而不是黑名单,因为已经使用了特殊字符。e、 g.“á(123)555-4567免费:á(891)0”必须变成1235554567

我正试着用它

但是,当我尝试使用此选项时:

TRANSLATE(SFCONTACT.PHONE,'',TRANSLATE(SFCONTACT.PHONE,'','1234567890',''),'') as clean
我明白了

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

其中一条评论说,使用空格而不是空字符串可以消除这种情况。然而,对我来说,尝试:

TRANSLATE(SFCONTACT.PHONE,' ',TRANSLATE(SFCONTACT.PHONE,' ','1234567890',' '),' ') as clean
给出:

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

我怎样才能做到这一点

运行AS400 DB2,IBM版本V7R1M0

编辑(不确定这是否应该是一个单独的问题)

我按照建议尝试了以下方法:

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]强制转换参数中的字符无效。原因……:强制转换函数参数中的字符不正确。恢复…:将结果数据类型更改为可识别强制转换参数中的字符的类型,或将参数更改为包含结果数据类型值的有效表示形式。请重试该请求

如果我从插入中删除电话号码(取默认值null),则插入成功,因此我知道这是电话号码造成的

目标表中的列类型为数字(10,0)。我试过使用这个,但没有改变:

CAST(SUBSTR(REGEXP_REPLACE(PHONE, '[\D]', ''),1,10) AS NUMERIC(10,0)) AS MAINPHONE,
进一步资料:

在转换为数字之前,我尝试转换为char。没有变化

我尝试添加where子句(“mainphone为空”和“mainphone为非空”)来执行此操作,错误消息更改为:

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


Db2的平台和版本很重要

例如,DB2fori7.2为我提供了

原因……:函数TRANSLATE中指定的参数3对于原因代码1无效。原因代码及其含义如下:
1--参数必须是字符串常量。
2--参数必须是整数常量。
3--参数必须是数值常量。
4--参数的长度太长。
5--参数的值超出范围。
6--参数必须是有效的CCSID。
7--参数不能是参数标记。
8--内置函数不支持参数的数据类型。
9--参数无法引用具有活动列掩码的列,因为该函数不安全。
恢复…:有关函数的更多信息,请参阅《IBMi信息中心》一书中数据库类别中的DB2forIBMiSQL参考主题集合。更正为函数指定的参数。请重试该请求


Db2的平台和版本很重要

例如,DB2fori7.2为我提供了

原因……:函数TRANSLATE中指定的参数3对于原因代码1无效。原因代码及其含义如下:
1--参数必须是字符串常量。
2--参数必须是整数常量。
3--参数必须是数值常量。
4--参数的长度太长。
5--参数的值超出范围。
6--参数必须是有效的CCSID。
7--参数不能是参数标记。
8--内置函数不支持参数的数据类型。
9--参数无法引用具有活动列掩码的列,因为该函数不安全。
恢复…:有关函数的更多信息,请参阅《IBMi信息中心》一书中数据库类别中的DB2forIBMiSQL参考主题集合。更正为函数指定的参数。请重试该请求


对于非ascii字符,
TRANSLATE
功能无法正常工作。
请改用以下方法:

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);

对于非ascii字符,
TRANSLATE
功能无法正常工作。
请改用以下方法:

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);
使用“仅获取第一行”和二进制搜索,我发现了问题

它试图解析的电话号码是“请验证联系人和电子邮件”。去掉数字就会变成空字符串。。。无法很好地转换为数字(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,
使用“仅获取第一行”和二进制搜索,我发现了问题

它试图解析的电话号码是“请验证联系人和电子邮件”。去掉数字就会变成空字符串。。。无法很好地转换为数字(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,

Db2的哪个平台和版本?
\D
^\D
相同,这是iseries上案例真正重要的少数几个地方之一。把它写成小写的“d”…Derp。对,因为它是正则表达式。但是,解决这个问题并没有解决问题。首先,将char字符串转换为EBCDIC为我解决了这个问题
cast(cast(SUBSTR(REGEXP_REPLACE(PHONE,[\D],''),1,10)作为char(10)CCSID 37)作为numeric(10,0))
\D
匹配class
Number,Decimal digital
中的所有Unicode字符,其中包括阿拉伯数字,例如
٦
UU+0666阿拉伯-印度数字六,Db2不会将其转换为整数。因此,如果源数据是来自非受控源的自由格式输入,那么正则表达式中的
[0-9]
就不那么容易受到攻击。什么样的Db2平台和版本?
\D
^\D
相同,这是iseries上案例真正重要的少数几个地方之一。把它当作