我在Report Studio过滤器(DB2上运行的Cognos 8)中编写了以下CASE
语句:
CASE
WHEN (
_WEEK_OF_YEAR(?paramDate?) > _WEEK_OF_YEAR(_ADD_MONTHS(?paramDate?; -3))
)
THEN (
[BusinessView].[QueryItem].[Week] <= _WEEK_OF_YEAR(?paramDate?)
AND [BusinessView].[QueryItem].[Week] >= _WEEK_OF_YEAR(_ADD_MONTHS(?paramDate?; -3))
AND [BusinessView].[QueryItem].[Year] = _YEAR(?paramDate?)
)
ELSE (
([BusinessView].[QueryItem].[Week] <= _WEEK_OF_YEAR(?paramDate?)
AND [BusinessView].[QueryItem].[Year] = _YEAR(?paramDate?))
OR ([BusinessView].[QueryItem].[Week] >= _WEEK_OF_YEAR(_ADD_MONTHS(?paramDate?; -3))
AND [BusinessView].[QueryItem].[Year] = _YEAR(_ADD_MONTHS(?paramDate?; -3)))
)
END
但是出现错误XQE-PLN-0312: Filter expressions must evaluate to Boolean
。请注意,在WHEN
和THEN
和ELSE
下的表达式都做计算为布尔值。同样,将这些表达式单独放入过滤器中时,所有这些表达式均起作用。因此,我认为问题在于CASE语句本身。
还要注意,我在其他报告中编写了其他CASE
过滤器,它们按预期工作。因此,我怀疑日期函数与CASE
进行交互时会遇到麻烦。
我找到了this的答案,但是并没有解决问题:正如您在我的代码中看到的那样,我已经将所有括号都放在适当的位置。
请不要建议我避免使用CASE
语句,而应单独使用AND和OR。这确实有效,但是我想了解如何使CASE
也能正常工作。
答案 0 :(得分:0)
不需要任何 [if] 或 [case] 语句。只需使用逻辑运算符编写过滤条件即可。
答案 1 :(得分:-1)
您的CASE语句无效。 CASE语句的所有路径都必须返回一个值。尝试独立于CASE语句运行结果表达式。例如...
[BusinessView].[QueryItem].[Week] <= _WEEK_OF_YEAR(?paramDate?)
AND [BusinessView].[QueryItem].[Week] >= _WEEK_OF_YEAR(_ADD_MONTHS(?paramDate?; -3))
AND [BusinessView].[QueryItem].[Year] = _YEAR(?paramDate?)
...将导致错误。
此外,“ else_result_expression 的数据类型和任何 result_expression 的数据类型必须相同,或者必须是隐式转换。” (https://docs.microsoft.com/en-us/sql/t-sql/language-elements/case-transact-sql?view=sql-server-2017)
过滤器的结果必须为true或false。
是这样吗?
CASE
WHEN A=B
THEN 'value1'
WHEN A=C
THEN 'value2'
ELSE 'value3'
END = 'value3'