2012-04-23 86 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表达式。)