2017-10-09 15 views
-1

従業員インターフェイスファイルで使用されるSELECTステートメントを修正しようとしています。その理由は、従業員がEND_DATE ...従業員を通過したときにエラーが返されるためです。NVLを使用するカーソルのSQL SELECT

私はこれにかなり新しいので、終了日であるOracleユーザーをスキップするには、ここでNVL式を使用するのが最適だろうと思いますか?しかし、それを研究した後、私はそのコンセプトをあまりよく把握していないだけでなく、それが私が使用すべきものであるかどうかを確信していません。私も「NULL IS」を使用すると、このような状況では正しいことではないだろうと同僚によって提案された

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); 

:ここ

は声明です。本当?もしそうなら、なぜですか?

ありがとうございます。

+0

ではありません。私はあなたがu.end_dateフィールドに値がないことを意味すると思います。これが事実なら、私は 'AND u.end_date is null'が正しいと思います。それはなぜ正しくないのですか? – Hogan

+0

end_date列に値があるユーザーは、その日に人のアクセスが切断されることを意味する可能性があります。それは今から2年後だろう。 2年前;終了日が定義されていないことを意味するnullでもかまいません。あなたは、 "END_DATEの従業員を通過したときにエラーを返しています。だからエラーは何ですか?将来の日付であれば返されてはいけませんか?どうして日付が不明なエラーの原因になるのでしょうか?その人が戻ってきて「死んだ」必要がある場合はどうなりますか?レコードを選択できない場合、ユーザーはどのようにレコードを編集しますか?あまりにも多くの未知のものに対処する。 – xQbert

答えて

0

u.end_dateが過去の日付であるかどうか、またはnullではないかどうかを確認したいと思います。その場合、私は次の使用します。

AND COALESCE(u.end_date, SYSDATE) < SYSDATE 

それを行うためのOracleの特定の方法は、あなたが何を意味するかについて説明していないため、これを答えることができませ上

AND NVL(u.end_date, SYSDATE) < SYSDATE 
関連する問題