Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle中where子句中的大小写表达式_Sql_Oracle_Case_Where Clause - Fatal编程技术网

Sql Oracle中where子句中的大小写表达式

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

我有一个任务,根据某些条件从Oracle表中提取一些数据

如果一个人的JobFunctionCode='ADMIN',那么当他辞职时,会填写通知的终止日期,然后应提取他的数据

来自其他职位的人员职能代码,如经理、财务等,当他们在接受的终止日期辞职时,应填写他们的数据

基于这些条件,我在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子句。

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在同一天辞职,那么这两个人的数据应该都会出现,某种形式的或逻辑。。