Заявление CASE в фильтрах Report Studio - PullRequest
0 голосов
/ 07 января 2019

Я написал следующий оператор CASE в фильтре Report Studio (Cognos 8 работает в DB2):

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 all do оцениваются как логические. Кроме того, такие выражения все работают, когда помещены индивидуально в фильтр. Поэтому я утверждаю, что проблема заключается в самом утверждении CASE. Также обратите внимание, что я написал другие фильтры CASE в других отчетах, и они работают, как я ожидаю. Поэтому я подозреваю некоторые проблемы с функциями даты, взаимодействующими с CASE.

Я узнал этот ответ, но это не решило проблему: как вы можете видеть в моем коде, я уже поставил все скобки на место.

Пожалуйста, не предлагайте мне избегать выражения CASE и использовать вместо И и ИЛИ только; это на самом деле работает, но я хотел бы понять, как заставить CASE работать также.

1 Ответ

0 голосов
/ 07 января 2019

Ваш оператор 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'
...