informix - CASE / IF 表达式中的 IBM COGNOS 不兼容数据类型
问题描述
我已经尝试了几个小时来获得我认为的一个简单的 if-then-else 语句,以便在 IBM Cognos / Report Studio 10.0 中工作。我只是想在查询中创建一个数据项,以确定日期是星期几,然后返回计算日期。
if (cast(_day_of_week([Expected Delivery Date],1), integer) = 1)
then (_add_days([Expected Delivery Date],2))
else (current_date)
后端数据库是 Informix。我收到错误“ Corresponding data types must be compatible in CASE expression or DECODE”。
我已经尝试了所有我能想到的变体:有/无演员表,使用 case/when/then。我还创建了一个单独的数据项:
[计算星期几](数据项 - 计算正确)
cast(_day_of_week([Expected Delivery Date],1), integer)
[计算到期发货日期](数据项)
if ([Calc Day of Week] = 1)
then (_add_days([Expected Delivery Date],2))
else (current_date)
即使在我的下一个数据项中使用该数据项,我也会收到相同的错误。
我只能认为它不理解我将比较基于整数并尝试返回日期 - 但如果是这种情况,我如何创建数据项来执行这样的计算?
任何帮助是极大的赞赏。
解决方案
错误是说 THEN 和 ELSE 部分的数据类型不同。第一步是确定数据类型。你没有提到你是否用你提到的计算做到了这一点。他们似乎专注于函数的 IF 部分。
基本技术称为分而治之。更优雅的措辞是,控制变量或隔离组件。
_day_of_week 返回一个 int 所以我不知道你为什么要进行强制转换。(_day_of_week([Expected Delivery Date] = 1 ) 应该足够了,但那是以后的事了。
取 _add_days([预计交货日期],2)。将其放入表达式并找出返回的数据类型。
将该数据类型与 current_date 进行比较。
Current_date 返回一个日期。预计交货日期的数据类型是什么?日期或日期时间?
如果数据类型不同,那么您的方法是修改一个或另一个以匹配另一个。例如,如果是日期时间,则将 _add_days([Expected Delivery Date],2) 转换为 date。或者使用 current_timestamp 但我不使用它所以我不能多说。
如果您使用 1=1 和 1<>1 代替您的 if 部分,那么您可以控制表达式的流程并验证错误来自 then 和 else 位。
这是另一个应用程序的内容,但在概述测试技术时有效。
https://www.ibm.com/support/pages/corresponding-types-must-be-compatible-case-expression
推荐阅读
- python - 在 Python 中使用 RegEx 查找关键字列表和指向之间的文本
- linux - 无人登录时如何运行维护脚本?
- swift - Swift Firestore 在创建文档之前生成文档 ID
- c# - C#:引用在另一个类中创建的类的实例
- python - Pygame 错误:self.spritedict[spr] = surface_blit(spr.image, spr.rect)
- validation - Codeigniter 验证总是返回 false 但 validation_errors() 为空
- c# - 尝试访问 Azure Function 时出错
- sql - .NET 多行 SQL 插入支持基于集合的操作
- java - 如何创建地图
> java 8 单流? - vue.js - 如何在纯 js 文件中编写 vue 组件?[没有构建和 webpack 的 Vue.js]