Sql Oracle中where子句中的大小写表达式
我有一个任务,根据某些条件从Oracle表中提取一些数据 如果一个人的JobFunctionCode='ADMIN',那么当他辞职时,会填写通知的终止日期,然后应提取他的数据 来自其他职位的人员职能代码,如经理、财务等,当他们在接受的终止日期辞职时,应填写他们的数据 基于这些条件,我在WHERE子句中写了一个case语句,但它给出缺少括号的错误。此SQL是计划运行的,因此我已将终止日期设置为sysdate,并将每天运行Sql Oracle中where子句中的大小写表达式,sql,oracle,case,where-clause,Sql,Oracle,Case,Where Clause,我有一个任务,根据某些条件从Oracle表中提取一些数据 如果一个人的JobFunctionCode='ADMIN',那么当他辞职时,会填写通知的终止日期,然后应提取他的数据 来自其他职位的人员职能代码,如经理、财务等,当他们在接受的终止日期辞职时,应填写他们的数据 基于这些条件,我在WHERE子句中写了一个case语句,但它给出缺少括号的错误。此SQL是计划运行的,因此我已将终止日期设置为sysdate,并将每天运行 select ppos.person_id, paam.position_i
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子句。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'))));
注意:只需检查括号闭包,并根据您的表设计在exists子句中写入查询即可您可以尝试:
((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'))));
注意:只需检查括号闭包,并根据您的表设计在exists子句中写入查询在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'
在where子句case when不允许的情况下,您可以用下面的方式写下您的条件
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'
所以,如果管理员在通知的终止日期辞职,而其他jobFunctionCode在接受的终止日期辞职,基本上您需要获取数据。这是要求吗?是的,而且如果具有JobFunctionCode“ADMIN”的人员A和具有JobFunctionCode“MANAGER”的人员B在同一天辞职,那么这两个人的数据应该都会出现,某种形式或逻辑…可能是…所以,基本上,如果管理员在通知的终止日期辞职,而其他jobFunctionCode在接受的终止日期辞职,您需要获取数据。这是要求吗?是的,而且如果具有JobFunctionCode“ADMIN”的人员A和具有JobFunctionCode“MANAGER”的人员B在同一天辞职,那么这两个人的数据应该都会出现,某种形式的或逻辑。。