2012-04-23 50 views
1

我有以下查詢甲骨文如果where子句

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

它的偉大工程,以縮小記錄它插入的一天,需要返回只有一個記錄的語句。但問題是週六或週日沒有插入記錄,打破了過濾的有用性。

對於週六或週日,我需要獲取週五的數據。我認爲像下面這樣的邏輯會起作用。但這不能在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') 

在這一點上,我需要使這個工作在一個選擇語句。無法使用存儲過程。任何人都可以想到一個解決方案或解決方法?

回答

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 ... 
+0

這只是我需要的。謝謝 – Zolt 2012-04-23 21:24:06

+1

不錯,很好的解決方案。 – fa1c0n3r 2012-09-07 12:43:19

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表達式。)