4

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

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

4

1 回答 1

2

当你的查询被执行时,解析器会注意到第二次使用 of:"SOURCECHAR10"是在一个需要整数的地方使用的。因此,它将始终将 :SOURCECHAR10 的内容转换为该位置的整数,即使如果字符串为非整数则不使用它。

实际上,Firebird 不用:"SOURCECHAR10"作参数,但您的连接库会将其转换为两个单独的参数占位符?,第二个占位符的类型将是 INTEGER。所以转换发生在实际查询执行之前。

解决方案可能是(我没有测试它,可能包含语法错误)使用类似的东西(注意:有关正确解决方案,请参阅第二个示例):

CASE 
   WHEN :"SOURCECHAR10" SIMILAR TO '[[:DIGIT:]]*' 
      THEN CAST(:"SOURCECHAR10" AS INTEGER) 
   ELSE 0 
END

这不起作用,因为这被解释为参数本身的转换,请参阅CAST() 项“转换输入字段”

如果这不起作用,您还可以尝试向 VARCHAR 添加显式强制转换,:"SOURCECHAR10"以确保参数被正确识别为 VARCHAR:

CASE 
   WHEN :"SOURCECHAR10" SIMILAR TO '[[:DIGIT:]]*' 
      THEN CAST(CAST(:"SOURCECHAR10" AS VARCHAR(10) AS INTEGER) 
   ELSE 0 
END

这里内部转换应用于参数本身,外部转换在 CASE 表达式被评估为 true 时应用

于 2012-01-10T13:16:11.367 回答