2016-06-08 193 views
0

美好的一天Stackoverflow!PL/SQL在WHERE子句中使用CASE

我有一个查询给了我一个错误:“缺少右括号”,至少,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 

回答

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 

等,如果你想整个解决方案,DM我,我会送你的代码。

干杯!

0

作为每TomCASE语法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