PL / SQL在WHERE子句中使用CASE

时间:2016-06-08 17:55:23

标签: 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

2 个答案:

答案 0 :(得分:1)

解决了问题,感谢那些试图找到解决方案的人。

解决方案:我没有使用CASE语句,而是创建了一个存储过程,将CASE替换为IF并从我的查询中构建了一个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

等等,如果你想要整个解决方案,DM我和我都会发给你代码。

干杯!

答案 1 :(得分:0)

根据Tom CASE中的WHERE CLAUSE语法为 -

 --Syntax
    select *  from <table name>
    where 1=1
    and 
    (case 
    when <BOOLEAN_EXPRESSION> 
    then <SCALAR_RETURN_VALUE>
    ... 
    ELSE <SCALAR_RETURN_VALUE>
    end) = <SCALAR_VALUE> ;

示例:

 --Query       

 WITH SAMPLE_DATA AS
    (select 100 COL1,999 COL2 from DUAL UNION ALL
     select 200 COL1,888 COL2 from DUAL
     )
 SELECT * FROM SAMPLE_DATA
 WHERE 1=1 
 AND     (
          CASE COL2
            WHEN 999 THEN 1
            ELSE 0
            END 
         ) = 1 ; 

  -- Output:              
    100   999