2010-11-16 35 views
3

我的問題是關於一個名爲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個字符,則檢查第二個字母,如果不是'E'或'A'或'T'則顯示兩個字母,否則顯示第一個字母。否則,如果3個字符,則顯示前2個字母。

4)我需要一個過濾器來爲我的where子句讀取contract_nm數據,忽略前五個字符(F.US.),然後忽略最後3個字符,即Z11。現在,我們正在使用的是中間數據的1個字符(9個長度)或2個字符(10個長度)或3個字符(11個長度),總是見下面的數據。如果是2個字符,那麼檢查第二個字母,如果不是'E'或'T',則不要拉取數據,否則就這樣做。否則,如果有3個字符,那麼檢查第三個字母,如果不是'E'或'T'則不要拉取數據,否則就這樣做。

回答

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; 

分享和享受。

2

1)我需要顯示contract_nm的最後3 個字符。

使用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 
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