Report Studio过滤器中的CASE语句

时间:2019-01-07 15:00:48

标签: filter db2 case-statement cognos-8

我在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。请注意,在WHENTHENELSE下的表达式都计算为布尔值。同样,将这些表达式单独放入过滤器中时,所有这些表达式均起作用。因此,我认为问题在于CASE语句本身。 还要注意,我在其他报告中编写了其他CASE过滤器,它们按预期工作。因此,我怀疑日期函数与CASE进行交互时会遇到麻烦。

我找到了this的答案,但是并没有解决问题:正如您在我的代码中看到的那样,我已经将所有括号都放在适当的位置。

请不要建议我避免使用CASE语句,而应单独使用AND和OR。这确实有效,但是我想了解如何使CASE也能正常工作。

2 个答案:

答案 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'