【发布时间】: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 <CAS...> = 'Y'。如果您删除该部分,最后还有:ELSE 'N',这将在b not IN ('To be Received', 'Received')的情况下返回。所以是多余的。除非你以不同的方式使用代码。 -
所有条件是否互斥?如果不是,则不应删除该条件。
-
条件不互斥。
标签: oracle plsql nested conditional-statements case