在 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 中进行铸造的主要内容,如果未能解决你的问题,请参考以下文章

在 Hibernate 中为 Informix 数据库中的列进行类型转换

Informix 查询计划

处理大量数字 C、Java、Informix

如何在 Informix 中创建 CHECK 约束?

如何在 Informix 中打开和读取文件

Informix:IN 子句中的项目数量限制?