棘手使用子串

时间:2010-11-16 09:08:43

标签: oracle substring

我的问题是关于一个名为contract_nm varchar2(14)的字段。我需要从中获取3个不同的值,使用该字段来获取where子句的过滤器。

以下是样本数据以及数据的长度,可以是9或10或11,现在不再是。

CONTRACT_NM               LENGTH(CONTRACT_NM)
F.US.WZ10                          9
F.US.WZ11                          9
F.US.WZ12                          9
F.US.RBZ10                         10
F.US.RBZ11                         10
F.US.RBZ12                         10
F.US.ZWAZ10                     11
F.US.ZWAZ11                     11
F.US.ZWAZ12                     11
etc

1)我需要显示contract_nm的最后3个字符。

2)检查contract_nm的最后3个字符,看看第一个字母是否是下面的字母之一,然后是MONTH,YEAR将是接下来的2个字母,DAY将默认为第一天这个月。我需要显示日期,因为它会进入日期字段。

Trade Months (Terms):
F              January                                
G             February                              
H             March                   
J              April                       
K             May
M       June                           
N             July
Q             August
U             September
V             October
X             November
Z       December

3)这有点难以用书面解释,我会尽力希望你理解我!读取contract_nm数据,忽略前五个字符(F.US.),然后忽略最后3个字符,即Z11。现在,我们正在使用的是中间的1个字符(9个长度)或2个字符(10个长度)或3个字符(11个长度)的数据,总是看到下面的数据。如果是1个字符,则显示该字母,否则显示2个字符,然后检查第2个字母,如果不是“E”或“A”或“T”,则显示两个字母,否则只显示第一个字母。否则,如果是3个字符,则显示前2个字母。

4)我的where子句需要一个过滤器来读取contract_nm数据,忽略前五个字符(F.US.),然后忽略最后3个字符,即Z11。现在,我们正在使用的是中间的1个字符(9个长度)或2个字符(10个长度)或3个字符(11个长度)的数据,总是看到下面的数据。如果是2个字符,则检查第二个字母,如果不是'E'或'T',则不要拉数据,否则执行。否则,如果是3个字符,那么检查第3个字母,如果不是'E'或'T',那么不要拉数据,否则就这样做。

3 个答案:

答案 0 :(得分:5)

尝试以下方法:

问题1:

  contract_nm_month_year := substr(contract_nm, -3);

问题2:

  contract_date := CASE substr(contract_nm, -3, 1)
                      WHEN 'F' THEN TO_DATE('01-JAN-' || SUBSTR(contract_nm, -2), 'DD-MON-RR');
                      WHEN 'G' THEN TO_DATE('01-FEB-' || SUBSTR(contract_nm, -2), 'DD-MON-RR');
                      WHEN 'H' THEN TO_DATE('01-MAR-' || SUBSTR(contract_nm, -2), 'DD-MON-RR');
                      WHEN 'J' THEN TO_DATE('01-APR-' || SUBSTR(contract_nm, -2), 'DD-MON-RR');
                      WHEN 'K' THEN TO_DATE('01-MAY-' || SUBSTR(contract_nm, -2), 'DD-MON-RR');
                      WHEN 'M' THEN TO_DATE('01-JUN-' || SUBSTR(contract_nm, -2), 'DD-MON-RR');
                      WHEN 'N' THEN TO_DATE('01-JUL-' || SUBSTR(contract_nm, -2), 'DD-MON-RR');
                      WHEN 'Q' THEN TO_DATE('01-AUG-' || SUBSTR(contract_nm, -2), 'DD-MON-RR');
                      WHEN 'U' THEN TO_DATE('01-SEP-' || SUBSTR(contract_nm, -2), 'DD-MON-RR');
                      WHEN 'V' THEN TO_DATE('01-OCT-' || SUBSTR(contract_nm, -2), 'DD-MON-RR');
                      WHEN 'X' THEN TO_DATE('01-NOV-' || SUBSTR(contract_nm, -2), 'DD-MON-RR');
                      WHEN 'Z' THEN TO_DATE('01-DEC-' || SUBSTR(contract_nm, -2), 'DD-MON-RR');
                      ELSE NULL;
                    END;

问题3:

  display_3 := CASE length(contract_nm)
                 WHEN 9 THEN SUBSTR(contract_nm, 6, 1);
                 WHEN 10 THEN
                    CASE SUBSTR(contract_nm, 7, 1)
                      WHEN 'E' THEN SUBSTR(contract_nm, 6, 1);
                      WHEN 'A' THEN SUBSTR(contract_nm, 6, 1);
                      WHEN 'T' THEN SUBSTR(contract_nm, 6, 1);
                      ELSE SUBSTR(contract_nm, 6, 2);
                    END;
                 WHEN 11 THEN SUBSTR(contract_nm, 6, 2)
               END;

问题4:

  WHERE CASE length(contract_nm)
          WHEN 9 THEN 0 -- never pull data for contract length = 9
          WHEN 10 THEN
            CASE SUBSTR(contract_nm, 7, 1)
              WHEN 'E' THEN 1
              WHEN 'T' THEN 1
              ELSE 0
            END
          WHEN 11 THEN
            CASE SUBSTR(contract_nm, 8, 10
              WHEN 'E' THEN 1
              WHEN 'T' THEN 1
              ELSE 0
            END
          ELSE 0
        END = 1;

分享并享受。

答案 1 :(得分:4)

专注于如何将CONTRACT_NM分解为您需要的部分。然后创建一个视图,以便您可以将每个部分视为一列。然后应用您的各种条件和转换应该是直截了当的。

看起来你总是忽略前5个字符,所以就把它们砍掉。

SELECT SUBSTR( contract_nm, 5, LENGTH(contract_nm)-8 ) flags,
       SUBSTR( contract_nm, -3, 1 ) month_flag,
       SUBSTR( contract_nm, -2 ) year
  FROM table

1)month_flag||year
2)

TO_DATE(
        CASE month_flag WHEN 'F' THEN 'JAN' WHEN 'G' THEN 'FEB' ... END || year,
        'MONRR'
        )

3)

CASE WHEN LENGTH(flags) = 3
          THEN SUBSTR(flags,1,2)
        WHEN LENGTH(flags) = 2 AND SUBSTR(flags,2,1) NOT IN ('E','A','T')
          THEN flags
        ELSE SUBSTR(flags,1,1)

4)非常类似于#3

答案 2 :(得分:2)

  

1)我需要显示最后3个   contract_nm的字符。

使用SUBSTR(contract_nm,-3)

重新启动Q2,使用CASE表达式,如:

CASE SUBSTR(contract_nm, -3, 1)
  WHEN 'F' THEN TO_DATE('JAN'||SUBSTR(contract_nm, -2), 'MONRR')
  WHEN 'G' THEN TO_DATE('FEB'||SUBSTR(contract_nm, -2), 'MONRR')
  ...etc.
  END