使用IIF和SIMILAR TO在INSERT中将char转换为整数

时间:2012-01-10 12:41:48

标签: sql firebird firebird2.5

我在insert语句中使用IB Datapump将BDE表(源)转换为Firebird表(目标)。因此,INSERT语句由源表值通过参数提供。其中一个源字段参数是alphanum (SOURCECHAR10 char(10),主要包含整数,需要在(整数类型)目标列NEWINTFLD中转换为整数。如果SOURCECHAR10不是数字,我想将0分配给NEWINTFLD

我使用IIFSIMILAR来测试字符串是否为数字,如果不是数字则分配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生成了错误。 任何想法如何解决这个问题?

1 个答案:

答案 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时应用外部强制转换