Выражение case в предложении where в Oracle - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть некоторые данные из таблиц Oracle, основанные на каком-то условии.

Если человек с JobFunctionCode = 'ADMIN', то, когда он уходит в отставку, заполняет уведомленное_termination_date, а затем его данные должны быть получены.

Человек из другого JobFunctionCode, такого как Manager, Finance и т. Д., Когда он подает в отставку, заполняет значение accept_termination_date, тогда его данные должны быть получены.

Поэтому, извлекая данные, основанные на этих условиях, я написал заявление о ситуации в своемWHERE, но в нем отсутствует ошибка в скобках.Этот SQL-запрос запускается по расписанию, поэтому я установил даты завершения sysdate, и он будет выполняться ежедневно.

select ppos.person_id, paam.position_id, pjf.job_function_code 
from 
    per_all_assignments_m paam, per_periods_of_service ppos, per_jobs_f pjf
    where
    case
        when    pjf.job_function_code = 'ADMIN' then (TO_CHAR(ppos.notified_termination_date, 'YYYY-MM-DD') = TO_CHAR(SYSDATE, 'YYYY-MM-DD'))
        else    (TO_CHAR(ppos.accepted_termination_date, 'YYYY-MM-DD') = TO_CHAR(SYSDATE, 'YYYY-MM-DD'))
    end
    and paam.person_id = ppos.person_id
    and paam.job_id = pjf.job_id
    and paam.primary_flag = 'Y'
    and TO_CHAR(paam.effective_end_date, 'YYYY-MM-DD') = '4712-12-31'
    and TO_CHAR(pjf.effective_end_date, 'YYYY-MM-DD') = '4712-12-31'

Также может быть условие, когда Person из обоих JobFunctionCode завершает работу, а затем обаличные данные должны быть извлечены, поэтому я не думаю, что в этом случае можно использовать выражение CASE.

Пожалуйста, дайте мне знать, как написать логику здесь?

Ответы [ 3 ]

0 голосов
/ 12 сентября 2018

Вы можете попробовать:

((case 
   when pjf.job_function_code = 'ADMIN'
       case 
          when (TO_CHAR(ppos.notified_termination_date, 'YYYY-MM-DD') = TO_CHAR(SYSDATE, 'YYYY-MM-DD')) then 'Y'
          else 'N'
       end
   else 
      case  
         when (TO_CHAR(ppos.accepted_termination_date, 'YYYY-MM-DD') = TO_CHAR(SYSDATE, 'YYYY-MM-DD')) then 'Y'
         else 'N'
      end
end )='Y'  
or exists (select * from <<tablename>> pjf.job_function_code = 'ADMIN' 
and (TO_CHAR(ppos.notified_termination_date, 'YYYY-MM-DD')) = (TO_CHAR(ppos.accepted_termination_date, 'YYYY-MM-DD'))));

PS: просто проверьте закрытие скобок и напишите запрос в предложении Существует в соответствии с вашим дизайном таблицы

0 голосов
/ 12 сентября 2018

В случае предложения where, когда это не разрешено, вы можете написать свое условие следующим образом

where       
   ( pjf.job_function_code = 'ADMIN' AND 
  (TO_CHAR(ppos.notified_termination_date, 'YYYY-MM-DD') = TO_CHAR(SYSDATE, 'YYYY-MM-DD'))
    Or    (TO_CHAR(ppos.accepted_termination_date, 'YYYY-MM-DD') = TO_CHAR(SYSDATE, 'YYYY-MM-DD'))
    )
and paam.person_id = ppos.person_id
and paam.job_id = pjf.job_id
and paam.primary_flag = 'Y'
and TO_CHAR(paam.effective_end_date, 'YYYY-MM-DD') = '4712-12-31'
and TO_CHAR(pjf.effective_end_date, 'YYYY-MM-DD') = '4712-12-31'
0 голосов
/ 12 сентября 2018

Предложение where должно быть:

where
(
    (pjf.job_function_code = 'ADMIN' and TO_CHAR(ppos.notified_termination_date, 'YYYY-MM-DD') = TO_CHAR(SYSDATE, 'YYYY-MM-DD'))
    or (pjf.job_function_code <> 'ADMIN' and TO_CHAR(ppos.accepted_termination_date, 'YYYY-MM-DD') = TO_CHAR(SYSDATE, 'YYYY-MM-DD'))
)
and <rest of clauses>

Я не рассмотрел остальную часть, требуется ли TO-CHAR и т. Д., Но это исправит ваше предложение where.

...