【问题标题】:How to optimize nested CASE statements in PL/SQL如何优化 PL/SQL 中的嵌套 CASE 语句
【发布时间】:2019-10-23 15:14:19
【问题描述】:

我对 PL/SQL 很陌生。 我在 SELECT 查询中使用以下嵌套 CASE 语句。这跟在 WHERE 子句之后。 但是,由于这种嵌套,查询需要大约 6 分钟才能完成。如果删除了至少一个 CASE 块,则查询只需大约 1 分钟即可完成。 有没有办法优化这个查询?

(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')

我尝试过使用 IF-ELSE 块,但效果不佳。

【问题讨论】:

  • 至少这个:when b not IN ('To be Received', 'Received') then 'N',是多余的,可以去掉。
  • 谢谢!但是当它被删除时,查询的结果也会发生变化。原始查询结果为 1906 行,删除您提到的条件后,查询结果为 5497 行。
  • 你说:这跟在 WHERE 子句之后,所以语句是:WHERE &lt;CAS...&gt; = 'Y'。如果您删除该部分,最后还有:ELSE 'N',这将在b not IN ('To be Received', 'Received') 的情况下返回。所以是多余的。除非你以不同的方式使用代码。
  • 所有条件是否互斥?如果不是,则不应删除该条件。
  • 条件不互斥。

标签: oracle plsql nested conditional-statements case


【解决方案1】:

如何用 AND 聚合父案例中的嵌套案例?

(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 and c != k then
 'Y'
 when NVL(h, 0) + NVL(i, 0) + NVL(j, 0) <> 0 and (-l != NVL(e, 0) + NVL(f, 0) + NVL(g, 0) + NVL(m, 0)) then
 'Y'
 -- this serves as else 'N' in your code  
 when NVL(h, 0) + NVL(i, 0) + NVL(j, 0) <> 0 then
 'N'
 else 'N'
 end = 'Y')

【讨论】:

  • 感谢您的回答,但是为每个条件添加 when NVL(h, 0) + NVL(i, 0) + NVL(j, 0) &lt;&gt; 0 是重复的并且是多余的。即使可以删除一个 CASE 块,它也会增加完成查询所需的时间(大约 6 分 30 秒)。
猜你喜欢
  • 1970-01-01
  • 2011-03-12
  • 1970-01-01
  • 2012-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多