1

次のクエリがあります

SELECT * FROM(
  SELECT
       CASE
            WHEN TO_CHAR (ADD_MONTHS(:DATEINPUT, 1), 'MM') = '10' 
            THEN
                TO_CHAR (ADD_MONTHS(:DATEINPUT, 1), 'MM')
            WHEN SUBSTR (TO_CHAR (ADD_MONTHS(:DATEINPUT, 1), 'MM'), 1, 1) = '0' 
            THEN
               SUBSTR (TO_CHAR (ADD_MONTHS(:DATEINPUT, 1), 'MM'), 2, 1)
            ELSE
               SUBSTR (TO_CHAR (ADD_MONTHS(:DATEINPUT, 1), 'MM'), 1, 2) 
         END
            AS CUR_MONTH_FRMTD,
       P.OPR_DATE,
       P.INDICE,
       P.LOAD_TYPE,
       P.CONTRACT_MONTH,
       P.CONTRACT_YEAR,
       P.VALUE,
       P.DATE_INSERTED,
       P.DATE_UPDATED
  FROM ZE_DATA.PWX_FWD_CURVE P ) Q
  WHERE
  Q.LOAD_TYPE = 'HLH'
  AND Q.INDICE = 'MidC'
  AND Q.CONTRACT_YEAR = TO_CHAR(:DATEINPUT, 'YYYY') 
  AND Q.CONTRACT_MONTH = Q.CUR_MONTH_FRMTD
  AND TO_CHAR(Q.DATE_INSERTED, 'MM') = TO_CHAR(:DATEINPUT, 'MM')
  AND TO_CHAR(Q.DATE_INSERTED, 'YY') = TO_CHAR(:DATEINPUT, 'YY')
  AND TO_CHAR(Q.DATE_INSERTED, 'DD') = TO_CHAR(:DATEINPUT, 'DD')

必要に応じて 1 つのレコードのみを返し、挿入された日にレコードを絞り込むのに最適です。しかし問題は、土曜日または日曜日にレコードが挿入されないことであり、フィルタリングの有用性が損なわれます。

土曜日または日曜日の場合、金曜日のデータを取得する必要があります。以下のようなロジックが機能すると思いました。しかし、これは Oracle SQL では実行できません。

  IF TO_CHAR(:DATEINPUT, 'DAY') = 'SATURDAY' THEN
  WHERE
  ....
  AND TO_CHAR(Q.DATE_INSERTED, 'DD') = TO_CHAR(:DATEINPUT-1, 'DD')
  ELSE IF TO_CHAR(:DATEINPUT, 'DAY') = 'SUNDAY' THEN
  WHERE
  ....
  AND TO_CHAR(Q.DATE_INSERTED, 'DD') = TO_CHAR(:DATEINPUT-2, 'DD') 

この時点で、select ステートメントでこれを機能させる必要があります。ストアド プロシージャを使用できません。誰かが解決策または回避策を考えることができますか?

4

2 に答える 2

3

IF の代わりに、ネストされたものだけでなく、このようにしないのはなぜですか

Where ...
  AND 
    (
        (TO_CHAR(:DATEINPUT, 'DAY') = 'SATURDAY' AND TO_CHAR(Q.DATE_INSERTED, 'DD') = TO_CHAR(:DATEINPUT-1, 'DD'))
        OR 
        (TO_CHAR(:DATEINPUT, 'DAY') = 'SUNDAY' AND TO_CHAR(Q.DATE_INSERTED, 'DD') = TO_CHAR(:DATEINPUT-2, 'DD'))
    )
    AND ...
于 2012-04-23T20:34:13.007 に答える
0

要件を理解していれば、これはどうですか:

where  q.date_inserted =
       case to_char(:dateinput,'fmDy','nls_date_language = English')
           when 'Sat' then :dateinput -1
           when 'Sun' then :dateinput -2
           else :dateinput
       end;

(日付列とパラメーターに時間を含めることができる場合は、少し複雑になります。日付列がインデックス化されていないか、パーティション キーでないtrunc()場合は、すべてを配置することができます。そうである場合は、式を作成する価値があるかもしれませんbetween。)

于 2015-11-18T16:07:09.240 に答える