【问题标题】:SQL Error "No viable alternative at input'case'"SQL 错误\“输入时没有可行的替代方案\'case\'\”
【发布时间】:2022-11-04 16:06:14
【问题描述】:

我正在 Jaspersoft Studio 中创建报告,并希望根据用户提供的参数对输出进行排序。为此,我在 ORDER BY 子句中使用了 CASE WHEN。但是,查询编辑器在第一个 CASE 关键字上抛出错误 - “在输入 'case' 处没有可行的替代方案”。我的 SQL 知识有限,所以大部分内容对我来说都是新的。我在其他示例中对这个 CASE 进行了建模,但我无法弄清楚为什么这个编辑器会抛出错误。

select "RV_PROTOCOL_BASIC"."PROTOCOL_NO" as protocol_no,
            "RV_PROTOCOL_BASIC"."PI_NAMES" as principal_investigator,
            "RV_PROTOCOL_BASIC"."STATUS" as current_status,
            "RV_PROTOCOL_BASIC"."SPONSOR" as sponsor,
            CAST("RV_PROTOCOL_BASIC"."IRB_EXPIRATION" as DATE) as expiration_date,
            "RV_PROTOCOL_BASIC"."IRB_EXPIRATION_NA" as expiration_na
 from "RV_PROTOCOL_BASIC"
    join "RV_PROTOCOL_DETAILS"
        on "RV_PROTOCOL_BASIC"."PROTOCOL_NO" = "RV_PROTOCOL_DETAILS"."PROTOCOL_NO"
 where (
        "RV_PROTOCOL_BASIC"."STATUS" = 'OPEN TO ACCRUAL'
        OR "RV_PROTOCOL_BASIC"."STATUS" = 'CLOSED TO ACCRUAL'
        OR "RV_PROTOCOL_BASIC"."STATUS" = 'SUSPENDED'
    )
    AND (
        "RV_PROTOCOL_BASIC"."IRB_EXPIRATION" is null
        or "RV_PROTOCOL_BASIC"."IRB_EXPIRATION" < $P{currentDate}
        or "RV_PROTOCOL_BASIC"."IRB_EXPIRATION_NA" = 'Y'
    )
    AND $X{IN, "RV_PROTOCOL_BASIC"."PI_NAMES", selectedPI}
    AND $X{IN, "RV_PROTOCOL_BASIC"."SPONSOR", selectedSponsor}
    AND $X{IN, "RV_PROTOCOL_DETAILS"."DT4_REPORT_TYPE", dt4Type}
order by
    case
        when $P!{sortBy} = 'Protocol no.' and $P!{sortOrder} = 'Ascending' then "RV_PROTOCOL_BASIC"."PROTOCOL_NO"
        when $P!{sortBy} = 'Pis' and $P!{sortOrder} = 'Ascending' then "RV_PROTOCOL_BASIC"."PI_NAMES"
        when $P!{sortBy} = 'Current status' and $P!{sortOrder} = 'Ascending' then "RV_PROTOCOL_BASIC"."STATUS"
        when $P!{sortBy} = 'Sponsor' and $P!{sortOrder} = 'Ascending' then "RV_PROTOCOL_BASIC"."SPONSOR"
        when $P!{sortBy} = 'Expiration date' and $P!{sortOrder} = 'Ascending' then "RV_PROTOCOL_BASIC"."IRB_EXPIRATION_NA"
        when $P!{sortBy} = 'Expiration n/a?' and $P!{sortOrder} = 'Ascending' then "RV_PROTOCOL_BASIC"."IRB_EXPIRATION_NA"
    end ASC
    case
        when $P!{sortBy} = 'Protocol no.' and $P!{sortOrder} = 'Descending' then "RV_PROTOCOL_BASIC"."PROTOCOL_NO"
        when $P!{sortBy} = 'Pis' and $P!{sortOrder} = 'Descending' then "RV_PROTOCOL_BASIC"."PI_NAMES"
        when $P!{sortBy} = 'Current status' and $P!{sortOrder} = 'Descending' then "RV_PROTOCOL_BASIC"."STATUS"
        when $P!{sortBy} = 'Sponsor' and $P!{sortOrder} = 'Descending' then "RV_PROTOCOL_BASIC"."SPONSOR"
        when $P!{sortBy} = 'Expiration date' and $P!{sortOrder} = 'Descending' then "RV_PROTOCOL_BASIC"."IRB_EXPIRATION_NA"
        when $P!{sortBy} = 'Expiration n/a?' and $P!{sortOrder} = 'Descending' then "RV_PROTOCOL_BASIC"."IRB_EXPIRATION_NA"
    end DESC

【问题讨论】:

    标签: sql case sql-order-by jaspersoft-studio


    【解决方案1】:

    除非您真的在字符串中使用额外的引号存储参数 $P{sortBy},否则您不需要在 $P!{..} 中使用感叹号

    when $P{sortBy} = 'Protocol no.' and $P{sortOrder} = 'Ascending' 应该可以工作。

    在您的 CASE WHEN 语句中使用 $P!{sortBy} 可能会导致类似CASE WHEN Pis = 'Pis' a... 的结果。

    Here is some more info about $P!{

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-14
      • 1970-01-01
      • 2013-08-26
      • 2014-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多