Использование операторов CASE в предложении WHERE - PL / SQL - PullRequest
0 голосов
/ 04 октября 2019

Может кто-нибудь сказать мне, что толку от последнего 'Y' в " end = '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')

Кроме того, есть ли способ оптимизировать это?

Спасибо!

Ответы [ 2 ]

1 голос
/ 04 октября 2019

Last end = 'Y') - не что иное, как сравнение.

Ваш оператор case генерирует одно значение на основе условия, и если оно равно Y, то это условие будет проверено, и в результате будет учтена строка.

Допустим, если для какой-либо записи a = 'STAGE PAYMENT' имеет значение true, то ваш оператор case сгенерирует Y в качестве вывода, который будет снова сопоставлен с последним end = 'Y') и вернет true.

Ура !!

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

Поскольку ваше утверждение case является частью предложения where, то для формирования предиката существует = 'Y'.

Предикаты чаще всего имеют форму <some value> <comparison operator> <other value> (есть исключения, в первую очередьregexp_like), где <some value> и <other value> могут быть столбцами, функциями, литеральными значениями, выражениями, переменными и т. Д.

Ваше выражение case просто занимает место <some value>, то есть:

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