Как оптимизировать вложенные операторы CASE в PL / SQL - PullRequest
0 голосов
/ 23 октября 2019

Я совершенно новичок в PL / SQL. Я использую следующий вложенный оператор CASE в запросе SELECT. Это следует за предложением 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, но это не помогло.

1 Ответ

0 голосов
/ 23 октября 2019

Как насчет объединения вложенных в родительском случае с ANDs?

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