Oracle where 子句中的 case 表达式

Case expression in where clause in Oracle

我可以根据某些条件从 Oracle 表中提取一些数据。

如果一个人的 JobFunctionCode = 'ADMIN' 那么当他辞职时 notified_termination_date 填充然后他的数据应该被提取。

来自其他 JobFunctionCode(如经理、财务等)的人在他们辞职 accepted_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 都终止时,可能会有这样的情况,那么两个人的数据都应该被拉出,所以我认为在这种情况下不能使用 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'))));

P.S:只需检查括号闭包,并根据您的 table 设计

在 exists 子句中编写查询

where子句中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'