[英]Case expression in where clause in Oracle
我根據某些條件從Oracle表中提取了一些數據。
如果JobFunctionCode ='ADMIN'的人辭職,則在填充notify_termination_date時,應該提取他的數據。
來自其他JobFunctionCode(例如Manager,Finance等)的人員在辭職accept_termination_date時將填充他們的數據。
因此,根據這些條件提取數據,我在WHERE
子句中編寫了一個case語句,但是它給出了缺失的括號錯誤。 該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'
另外,可能存在這樣一個條件,當兩個JobFunctionCode中的Person都終止時,則應同時提取兩個person數據,因此我認為在這種情況下不能使用CASE
表達式。
請讓我知道如何在這里寫邏輯?
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子句。
你可以試試 :
((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:只需檢查方括號的關閉情況,然后根據您的表設計將查詢寫到exist子句
在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'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.