在 Informix 中进行铸造
Posted
技术标签:
【中文标题】在 Informix 中进行铸造【英文标题】:Casting in Informix 【发布时间】:2008-10-07 12:30:58 【问题描述】:在 Informix 中,如何将 char(8)
类型转换为 money
类型,以便可以将其与另一个 money
类型进行比较?
使用“tblAid.amt::money as aid_amt
”不起作用。
使用“(tblAid.amt * 1) AS aid_amt
”不起作用。
【问题讨论】:
您使用的是哪个版本的 Informix? (您应该总是说,因为答案可能会根据您的系统进行细微调整。答案会随着时间的推移而变化 - 如果您使用的是 IDS 7.31,则任何转换符号都不起作用。) 【参考方案1】:试试这个 -->
select (disb_amt::NUMERIC) disb_amt from tmp_kygrants;
您可以将金额作为数字进行比较。
【讨论】:
括号应该是多余但无害的。【参考方案2】:第一个问题 - 你到底为什么不在数值列中存储数值?这将使您的其余问题变得毫无意义。这也意味着您的系统将表现得更好。当需要存储数据值时,使用明显类型;除非数据是字符串,否则不要使用字符串类型。
如前所述,您可以使用非标准 Informix 强制转换表示法:
SELECT some_column::MONEY FROM WhereEver;
您还可以更加注意转换类型 - 例如使用 MONEY(8,2)。您也可以使用标准符号:
SELECT CAST(some_column AS MONEY(8,2)) FROM WhereEver;
这假设您使用的是 IDS 9.x 或更高版本——旧产品根本不支持强制转换。然而,一般来说,Informix 非常擅长自动进行转换(例如,将数字转换为字符串)。但是,字符串是按字典顺序而不是数字进行比较的,因此在这种情况下 CAST 可能更明智——但首先通过使用正确的类型来避免强制转换的需要仍然更明智。
【讨论】:
【参考方案3】:自从我使用informix 以来已经有一段时间了,目前我手边没有一个正在运行的实例。但是,这里有两件事可能会导致问题:
1) 因为它是一个 char(8),所以它可以包含在没有一点“清理”的情况下无法转换为数字的值。例如。 “ABC”。或“1,234,567.00”。 2) 尾随空格。 (char 而不是 varchar)。
您在显式转换 (::money) 中遇到什么 informix 错误?
【讨论】:
以上是关于在 Informix 中进行铸造的主要内容,如果未能解决你的问题,请参考以下文章