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

Posted

技术标签:

【中文标题】CASE 表达式 - 在 WHEN 部分再添加一个条件【英文标题】:CASE expression - add one more condition to the WHEN part 【发布时间】:2018-04-01 14:45:35 【问题描述】:

我创建了一个 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;

【问题讨论】:

您的键盘似乎有问题,您的大写锁定或 shift 键似乎卡住了。或者只是请停止对我们大喊大叫。 当然,兄弟,请尝试帮助解决编程问题:) 请注意网站为您的帖子添加的标签;通常默认值是相当随机的。我只是删除了对sql developer和plsql developer的引用,与您的问题无关。 嗨@vaibhavsaini,欢迎来到SO。礼貌地提问是获得更多帮助的好方法。您可以编辑您的问题以去掉所有大写字母。 关于术语的更多说明:确实存在 CASE statements,类似于 if... then... 并且在 CASE statement 中您可以进行 SQL 查询等.这不是您的代码中的内容。在您的代码中,您有一个 SQL 查询,其中有一个 CASE 表达式 【参考方案1】:

你所拥有的是一个 case 表达式(不是 case 语句)。

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

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

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

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

简单的case表达式:

case x when 1 then ....

也可以写成检索式:

case when x = 1 then ....

这两个在逻辑上是等价的。但是,如果我们想将“AND 3 > 1”添加到 WHEN 部分,则仅适用于 case 表达式的 searched 形式。

【讨论】:

你能重新编写代码并发送好吗???您是否建议在 When Condition 中再次使用 CASE ,因为我不想在那里使用 SQL 查询,而我只是检查 SQL 表达式 O/P 的大小写 @vaibhavsaini - 不,我展示的是你所拥有的。 WHEN 必须紧跟在 CASE 之后。标量子查询与 LAST_DAY... 的相等性必须显式写入(使用等号 = ),因此它是一个可以由逻辑运算符 AND 操作的逻辑条件,因此您可以添加第二个条件。例如:case x when 1 then... 有效。如您所见,case x when 1 and 3 &gt; 1 then... 不起作用;必须是case when x = 1 and 3 &gt; 1 then... 感谢 mathguy 的详细解释。非常感谢您的文章...谢谢【参考方案2】:

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

【讨论】:

感谢 William Robertson 的详细解释。非常感谢您的文章...谢谢 感谢 William Robertson 的详细解释。非常感谢您的文章...谢谢

以上是关于CASE 表达式 - 在 WHEN 部分再添加一个条件的主要内容,如果未能解决你的问题,请参考以下文章

SQL中关键字Case的使用

CASE 表达式 WHEN 的更短替代方案?

Spark:在 CASE WHEN 表达式中使用空检查来防止类型错误

select case when if 的一些用法

SQL中的decode及case when的用法

casewhen能用并且吗