2017-10-09 57 views
-1

我试图修改雇员接口文件中使用的SELECT语句,因为它传递一个员工的END_DATE时会返回一个错误...以及'过期'。SQL SELECT用于使用NVL的光标

我对此很新,所以为了跳过已过期的Oracle用户,我觉得使用NVL表达式在这里最好?然而,在研究之后,我只是没有把握这个概念,也不确定是否应该使用这个概念。

以下是该语句:

FROM oaa.xxap_employee_interim ei, 
       hr.per_all_people_f ppf, 
       hr.per_all_assignments_f paf, 
       hr.per_addresses pa, 
       apps.fnd_user u 
     WHERE new_update = 'U' 
     AND  ppf.person_type_id = 6 
     AND  ei.employee_number = ppf.employee_number 
     AND  ppf.effective_end_date >= SYSDATE 
     AND  ppf.person_id = paf.person_id 
     AND  paf.effective_end_date >= SYSDATE 
     AND  ppf.person_id = pa.person_id 
     AND  u.employee_id = ppf.person_id 
     --AND  NVL(u.end_date, SYSDATE + 5); 

我也被同事建议使用“IS NULL”不会在这种情况下是正确的。真的吗?如果是这样,为什么?

在此先感谢。

+0

没有上可以回答这个问题,因为你没有解释你的意思。我认为你的意思是在u.end_date字段中没有任何价值。如果这是一种情况,那么我会期待'AND u.end_date为null'是正确的。为什么它不正确? – Hogan

+0

因此,在end_date列中具有值的用户可能意味着该人员的访问将在该日期被切断。这可能是2年后。 2年前;或者可以为null意味着没有定义结束日期。你说,“当它通过一个员工,并且他们的END_DATE很好'过期'时,它会返回一个错误。”那么错误是什么?如果它是未来的日期,它不应该还原吗?为什么会有一个日期导致未知的错误?如果这个人回来,需要“没有日期?”会发生什么?如果你不能选择记录,用户将如何编辑它?太多的未知数需要解决。 – xQbert

回答

0

我会猜测你想检查u.end_date是否是过去的日期或者是否为空。在这种情况下,我会使用以下方法:

AND COALESCE(u.end_date, SYSDATE) < SYSDATE 

Oracle的具体办法做到这一点是

AND NVL(u.end_date, SYSDATE) < SYSDATE