2014-04-21 21 views
0
SELECT CAST(LAST_DAY(to_timestamp(lpad(cast(NUMBER_COLUMN as varchar2(6)), 6, '0'), 'MMYYYY')) AS TIMESTAMP) AS NUMBER_COLUMN_ALIAS FROM TAB1 T1 
    WHERE NOT EXISTS(SELECT TIMESTAMP_COLUMN FROM 
        (SELECT TIMESTAMP_COLUMN FROM TAB2) 
        WHERE TIMESTAMP_COLUMN=CAST(LAST_DAY(to_timestamp(lpad(cast(NUMBER_COLUMN as varchar2(6)), 6, '0'), 'MMYYYY')) AS TIMESTAMP)); 

我有兩個數據列 - 一個是NUMBER_COLUMN和一個是TIMESTAMP_COLUMN。我需要將NUMBER_COLUMN轉換爲TIMESTAMP_COLUMN格式並匹配它們的記錄。使用解碼輸入'不是有效的月'值,因爲它是

上面的查詢工作正常,但是我的NUMBER_COLUMN中有一些錯誤的數據值,它將返回錯誤'not a valid month'。 我的查詢只適用於數字值,如52002,41995,122016,它們將分別轉換爲5/31/2002,4/31/1995,12/31/2016等。

現在有這些'壞'數據值,如0,10000,131994,421996,731989等等。 我希望查詢返回錯誤的數據值,因此我不必將其轉換,否則使用CAST(LAST_DAY(to_timestamp(lpad(cast(NUMBER_COLUMN as varchar2(6)), 6, '0'), 'MMYYYY')) 轉換良好的數據值。

我可以手動列出解碼函數中的所有'壞'值,但有沒有更容易的方法來捕獲它們?

我正在用盡想法。 感謝

+0

爲什麼不乾脆讓自己的功能,你嘗試轉換,如果失敗,陷阱「不是一個有效的月」異常並返回原來的價值? – Craig

+0

@craig我需要將它們提取到遊標中並稍後使用批量加載。 – JohnD

回答

1
select number_column, 
     case when number_column between 10000 and 129999 
        and mod(number_column,10000) between 1900 and 2100 
       then 'good format' 
       else 'bad format' 
     end result 
from 
    (select 52002 number_column from dual union all 
    select 41995 number_column from dual union all 
    select 122016 number_column from dual union all 
    select 0 number_column from dual union all 
    select 10000 number_column from dual union all 
    select 131994 number_column from dual union all 
    select 421996 number_column from dual union all 
    select 731989 number_column from dual) 



╔════════╦═════════════╗ 
║ 52002 ║ good format ║ 
║ 41995 ║ good format ║ 
║ 122016 ║ good format ║ 
║  0 ║ bad format ║ 
║ 10000 ║ bad format ║ 
║ 131994 ║ bad format ║ 
║ 421996 ║ bad format ║ 
║ 731989 ║ bad format ║ 
╚════════╩═════════════╝ 
+0

是否可以用CAST(LAST_DAY(to_timestamp(lpad(cast(NUMBER_COLUMN as varchar2(6)),6,'0'),'MMYYYY'))來替換'good format'?我需要顯示轉​​換數據 – JohnD

+0

需要更多的指導,你不能在單個結果列中混合使用數據類型 - 所以你不能在單個結果列中有'好'記錄是TIMESTAMP和'壞'記錄是NUMBER。 VARCHAR2結果列,並將'good'記錄作爲格式化時間戳字符串返回,'bad'格式化爲簡單數字;或者同時返回(1)GOOD_FORMAT TIMESTAMP列,其中返回良好的val並將錯誤的val值加NULL(2)a BAD_FORMAT NUMBER列,其中好的VAL爲NULL,VAL爲NUMBER,「正確」的答案取決於您計劃對這些計算結果做什麼。 – KevinKirkpatrick

相關問題