我在insert语句中使用IB Datapump将BDE表(源)转换为Firebird表(目标)。因此,INSERT语句由源表值通过参数提供。其中一个源字段参数是alphanum (SOURCECHAR10 char(10)
,主要包含整数,需要在(整数类型)目标列NEWINTFLD
中转换为整数。如果SOURCECHAR10
不是数字,我想将0分配给NEWINTFLD
。
我使用IIF
和SIMILAR
来测试字符串是否为数字,如果不是数字则分配0,如下所示:
INSERT INTO "DEST_TABLE" (......, "NEWINTFLD",.....)
VALUES(..., IIF( :"SOURCECHAR10" SIMILAR TO '[[:DIGIT:]]*', :"SOURCECHAR10", 0),..)
但是,对于每个非数字字符串,我仍然会遇到转换错误(DSQL error code = -303)
。
我仅使用IIF
结果字段中的常量进行了测试,例如SOURCECHAR10" SIMILAR TO '[[:DIGIT:]]*', 1, 0)
,并且工作正常,因此SOURCECHAR10
的真实结果字段中的IIF
生成了错误。
任何想法如何解决这个问题?
答案 0 :(得分:1)
执行查询时,解析器会注意到:"SOURCECHAR10"
的第二次使用是在需要整数的地方使用。因此,它总是将SOURCECHAR10的内容转换为该位置的整数,即使字符串是非整数也不使用它。
实际上,Firebird不使用:"SOURCECHAR10"
作为参数,但您的连接库会将其转换为两个独立的参数占位符?
,第二个占位符的类型将为INTEGER。因此转换发生在执行实际查询之前。
解决方案可能(我没有测试它,可能包含语法错误)使用类似的东西(注意:请参阅第二个示例以获得正确的解决方案):
CASE
WHEN :"SOURCECHAR10" SIMILAR TO '[[:DIGIT:]]*'
THEN CAST(:"SOURCECHAR10" AS INTEGER)
ELSE 0
END
这不起作用,因为它被解释为参数本身的强制转换,请参阅CAST() item 'Casting input fields'
如果这不起作用,您还可以尝试在:"SOURCECHAR10"
周围向VARCHAR添加显式强制转换,以确保将参数正确识别为VARCHAR:
CASE
WHEN :"SOURCECHAR10" SIMILAR TO '[[:DIGIT:]]*'
THEN CAST(CAST(:"SOURCECHAR10" AS VARCHAR(10) AS INTEGER)
ELSE 0
END
此处内部强制转换应用于参数本身,当CASE表达式求值为true时应用外部强制转换