我需要对Informix IDS 9.x运行动态构造的查询;虽然WHERE子句大多非常简单,但Projection子句可能非常复杂,有很多列和应用于列的公式。这里有一个例子:
SELECT ((((table.I_ACDTIME + table.I_ACWTIME + table.I_DA_ACDTIME + table.I_DA_ACWTIME +
table.I_RINGTIME))+(table.I_ACDOTHERTIME + table.I_ACDAUXINTIME +
table.I_ACDAUX_OUTTIME)+(table.I_TAUXTIME + table.I_TAVAILTIME +
table.I_TOTHERTIME)+((table.I_AVAILTIME + table.I_AUXTIME)*
((table.MAX_TOT_PERCENTS/100)/table.MAXSTAFFED)))/(table.INTRVL*60))
FROM table
WHERE ...当使用的一些字段包含零时,问题就出现了;Informix可以预见地抛出被零除的错误,但错误消息没有多大帮助:
DBD::Informix::st fetchrow_arrayref failed:
SQL: -1202: An attempt was made to divide by zero.在这种情况下,最好在计算失败时返回NULL。除了解析投影子句并包含每个除法尝试以防万一之外,还有什么方法可以实现这一点吗?结束?我更喜欢使用一些DBD::Informix魔术,如果它存在的话。
发布于 2011-08-17 05:33:06
我不相信您能够使用DBD::Informix或任何其他数据库客户端来解决这个问题,而不是解析和重写SQL。没有使用/0算法忽略列的选项:当在引擎级遇到错误时,整个语句都会失败。
如果有任何帮助,你可以编写代码来避免将/0作为DECODE而不是CASE ... END,后者更简洁,例如:
DECODE(table.MAXSTAFFED, 0, NULL,
((table.MAX_TOT_PERCENTS/100)/table.MAXSTAFFED)))/(table.INTRVL*60)))发布于 2011-08-18 00:45:53
Informix是一个到Informix DBMS的接口,并且尽可能地瘦(虽然不像我希望的那样薄,但这是另一回事了)。DBD::Informix (或访问DBMS的任何其他DBD驱动程序)无法合理地协调这种行为;它必须由DBMS本身处理。
IDS不提供生成NULL而不是除以零错误的机制。这可能是一个合理的特性请求--但它最早也要等到Informix11.70的后续版本才能实现。
请注意,Informix Dynamic Server (IDS) 9.x已超过其支持的生命周期的最后几年(10.00也不受支持)。
发布于 2011-08-17 04:41:32
从使用informix的经验来看,我认为能够在IDS中获得这种功能将是您的幸运( IDS的早期版本--比您的版本早不了多少--几乎没有任何字符串操作函数,更不用说任何复杂的功能了。)
我会节省时间,并根据内存中的列表生成计算。
https://stackoverflow.com/questions/7084675
复制相似问题