【问题标题】:Usage of CASE Statements in WHERE Clause - PL/SQL在 WHERE 子句中使用 CASE 语句 - PL/SQL
【发布时间】:2019-10-04 14:43:15
【问题描述】:

谁能告诉我“end = 'Y')”中最后一个'Y'有什么用

( case
 when a = 'STAGE PAYMENT' then
 'Y'
 when b not IN ('To be Received', 'Received') then
 'N'
 when c != (d - NVL(e, 0) - NVL(f, 0) - NVL(g, 0)) then
 'Y'
 when NVL(h, 0) + NVL(i, 0) + NVL(j, 0) <> 0 then
    case 
    when c != k then
    'Y'
    when (-l != NVL(e, 0) + NVL(f, 0) + NVL(g, 0) + NVL(m, 0)) then
    'Y' 
    else 'N'
    end 
 else 'N'
 end = 'Y')

还有,有什么办法可以优化吗?

谢谢!

【问题讨论】:

  • 这个case语句的上下文是什么?看起来它可能是where 子句的一部分?
  • 是的,它是选择查询的一部分,它就在 where 子句之后。
  • 看起来声明 end = 'Y') 应该以 end) = 'Y' 结尾
  • @BarbarosÖzhan 外括号是完全没有必要的,所以右括号在 = 'Y' 之后还是之前都没有关系
  • 我的意思是两种方式都可以有或没有括号,这取决于 OP 呈现的内容,我认为括号@Boneist

标签: oracle plsql nested conditional-statements case


【解决方案1】:

最后一个end = 'Y')只是比较。

您的 case 语句正在根据条件生成一个值,如果它是 Y,那么将统计该条件并在结果中考虑行。

假设,如果a = 'STAGE PAYMENT' 对某些记录为真,那么您的case 语句将生成Y 作为输出,将再次与上一个end = 'Y') 进行比较并返回真。

干杯!!

【讨论】:

  • 非常感谢您的解释!! :)
【解决方案2】:

由于您的 case 语句是 where 子句的一部分,因此 = 'Y' 可以构成谓词。

谓词最常见的形式是&lt;some value&gt; &lt;comparison operator&gt; &lt;other value&gt;(也有例外,最值得注意的是regexp_like),其中&lt;some value&gt;&lt;other value&gt;可以是列、函数、字面值、表达式、变量等。

您的case 表达式只是取代了&lt;some value&gt;,即:

select ...
from   ...
where  <some_col> = 1
and    case .... end = 'Y'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-16
    • 2017-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    • 2021-11-12
    • 1970-01-01
    相关资源
    最近更新 更多