plsql - PL/SQL 在 WHERE 子句中使用 CASE

标签 plsql case-statement

美好的一天 Stackoverflow!

我有一个查询给我一个错误:“ 缺少右括号 ”,至少,SQL Developer 是这样说的。

我的查询在 WHERE 子句中有一个 CASE 语句,它接受一个参数,然后根据输入的值执行一个条件。

我读过在 WHERE 子句中使用 CASE 语句时,您必须用括号将语句括起来并将其分配给一个数值,例如“1”,但是这样做并不能实现我的目标。

我的目标是在满足条件时执行 CASE 语句中的条件。

你介意看看并给我一些意见吗?

谢谢!

 SELECT ...
    FROM ....
    WHERE 1 = 1
    AND (
           CASE :P_REPORT_PERIOD
                WHEN 'SPRING' 
                  THEN ((fiscal_year = (EXTRACT(YEAR FROM (SYSDATE))-1) AND period >=10) OR (fiscal_year = (EXTRACT(YEAR FROM (SYSDATE))) AND period < 4))
                WHEN 'FALL'   
                  THEN ((fiscal_year = (EXTRACT(YEAR FROM (SYSDATE))) AND period >=4) OR (fiscal_year = (EXTRACT(YEAR FROM (SYSDATE))) AND period < 10))
           END
    ) = 1

最佳答案

问题已解决,感谢所有试图找到解决方案的人。

解决方案:我没有使用 CASE 语句,而是创建了一个存储过程,用 IF 替换了 CASE,并根据我的查询构建了一个 VSQL 字符串。

示例:
VSQL := 'SELECT.....'

 IF (v_rpt_pd = 'SPRING') THEN
    VSQL := VSQL || '( ( AND EXTRACT(YEAR FROM (SYSDATE))-1  = fiscal_year and period >=10) or ';
    VSQL := VSQL || '  ( AND EXTRACT(YEAR FROM (SYSDATE))  = fiscal_year and period <=3) )';
ELSE
    VSQL := VSQL || '( ( AND EXTRACT(YEAR FROM (SYSDATE))  = fiscal_year and period >=4) or ';
    VSQL := VSQL || '  ( AND EXTRACT(YEAR FROM (SYSDATE))  = fiscal_year and period <=9) )';
 END IF; 

VSQL := VSQL ||' GROUP BY fiscal_year, period

依此类推,如果您想要整个解决方案,请私信我,我会将代码发送给您。

干杯!

关于plsql - PL/SQL 在 WHERE 子句中使用 CASE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37709619/

相关文章:

sql - 游标和 View 有什么区别?

oracle - oracle 11g中生成样本数据

c++ - 有没有类似模板化案例陈述的东西

sql - 在 where 子句中使用 case 语句

sql - 在创建 indextype 'WITH ARRAY DML' 选项的情况下,ODCIIndexInsert 的正确参数类型是什么(文档不匹配)

sql - 使用另一个表的最大日期更新一个表

oracle - 为什么最后一个 PL/SQL 语句使用 dbms_assert.enquote_literal 失败?

sql - Progress DB SQL 的 LIKE 运算符

java - 在 switch 语句中使用 switch 语句是否可以接受?

entity-framework - EF Left 在两个属性上加入一个表并结合一个 case 语句