Plsql PL/SQL在WHERE子句中使用CASE

Plsql PL/SQL在WHERE子句中使用CASE,plsql,case-statement,Plsql,Case Statement,日安 我有一个查询给了我一个错误:“缺少右括号””,至少SQL开发人员这样说 我的查询在WHERE子句中有一个CASE语句,它接受一个参数,然后根据输入的值执行一个条件 我已经读到,当在WHERE子句中使用CASE语句时,必须用括号将语句括起来,并将其指定给一个数值,例如“1”,但是这样做并不能实现我的目标 我的目标是在满足条件的情况下执行CASE语句中的条件 请你看一下,给我一些意见好吗 谢谢 SELECT ... FROM .... WHERE 1 = 1 AND

日安

我有一个查询给了我一个错误:“缺少右括号””,至少SQL开发人员这样说

我的查询在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=1
及(
案例:P_报告期
当‘春天’
然后((会计年度=(摘录(自(系统日期起的年度))-1)和期间>=10)或(会计年度=(摘录(自(系统日期起的年度))和期间<4))
当‘坠落’
然后((会计年度=(摘录(从(系统日期)算起的年度))和期间>=4)或(会计年度=(摘录(从(系统日期算起的年度))和期间<10))
结束
) = 1

由于所有试图找到解决方案的人,问题得以解决

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

示例:

VSQL:=“选择…”

 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
如果(v_rpt_pd='SPRING'),那么
VSQL:=VSQL | |'((和提取(从(SYSDATE)开始的年份))-1=会计年度和期间>=10)或';
VSQL:=VSQL | |'(并提取(从(SYSDATE)开始的年份))=会计年度和期间=4)或';
VSQL:=VSQL | |'(并根据
WHERE子句中的
CASE
语法提取(从(SYSDATE)开始的年份))=会计年度和期间

 --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