CASE表达式 - 为WHEN部分添加一个条件

时间:2018-04-01 14:45:36

标签: sql oracle plsql

我创建了一个PL / SQL函数,我在SQL查询中有一个case表达式。这工作正常,但是当我添加另一个when条件时,它将无法编译。即使我使用when ... and 2 > 1,也不会编译。

在下面的代码中,注释部分无法正常工作。

我想要的是在我的when子句中再添加一个检查。请指教。

create or replace function FUNCTION_NAME (date1 in varchar2,value1 in varchar2)
    RETURN date
IS
  date2 date;
BEGIN 
  SELECT D DATE2
    INTO DATE2 FROM (SELECT CASE (SELECT TO_DATE(MAX(G.DATE3),'DD-MON-YYYY')
                                    FROM TABLE1 G,
                                         TABLE2 N
                                    WHERE G.DATE3=N.DATE3)
                              WHEN LAST_DAY(TO_DATE(DATE1,'DD-MON-YYYY'))
                                   /* AND MONTHS_BETWEEN (LAST_DAY(TO_DATE(SYSDATE)),
                                      LAST_DAY(TO_DATE(TO_CHAR(DATE1),'DD-MON-YYYY'))) */
                                THEN LAST_DAY(TO_DATE(DATE1,'DD-MON-YYYY'))

                              ELSE
                                TO_DATE('31-DEC-99','DD-MON-YYYY')
                            END D
                       FROM DUAL);

  RETURN DATE2;
END;

2 个答案:

答案 0 :(得分:1)

你所拥有的是案例表达(不是案例陈述)。

案例表达有两种:“简单”(case <expr> when val1 then ... when val2 then...等)和“搜索”(case when condition1 then ... when condition2 then ...等。)

您将案例表达式编写为简单的案例表达式。那么,您不能为WHEN部分添加条件。您必须将案例表达式更改为“一直搜索”。

case when (select ...) = last_day(...) AND <your commented condition> THEN .....

编辑 - 在我的答案下方复制部分澄清评论。

简单的案例表达:

case x when 1 then ....

也可以写为搜索案例表达式:

case when x = 1 then ....

这两个在逻辑上是等价的。但是,如果我们要在WHEN部分添加“AND 3&gt; 1”,则仅适用于案例表达式的搜索形式。

答案 1 :(得分:1)

two flavours of CASE

简单案例:

select case dummy
            when 'X' then 1
       end as case_demo
from dual;

搜索案例:

select case
            when dummy = 'X' then 1
       end as case_demo
from   dual;

在你的查询中,你将它们混合起来,这样做无效:

select case dummy
            when 'X' and 1 = 1
            then 1
       end as case_demo
from   dual;

如果切换到“已搜索的CASE”,则可以添加更多when条件:

select case
            when dummy = 'X' and 1 = 1
            then 1
       end as case_demo
from   dual;