gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 21:36:00 26 4
gpt4 key购买 nike

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

我用 IIFSIMILAR to 测试字符串是否为数字,如果不是数字则分配 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)而且效果很好,所以不知何故: SOURCECHAR10IIF 的真实结果字段中产生错误。
任何想法如何解决这个问题?

最佳答案

当你的查询被执行时,解析器会注意到 :"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 时应用

关于sql - 使用 IIF 和 SIMILAR TO 在 INSERT 中将 char 转换为整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8803438/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com