2010-07-14 30 views
0

簡短版本: 將「5」作爲數字存儲到表中作爲數字的最佳方式是什麼?Oracle:將「5」作爲數字存儲

LONG VERSION: 這裏是問題,我有一個表,我正在讀取由VARCHAR2s組成的主表。我從一些字段獲取數據並將它們存儲在另一個表中,而無需修改。在一個字段中,我得到「5-」,並試圖將它存儲在一個數字字段中,因爲它不能將它轉換爲數字,所以會引發錯誤。

任何人都可以告訴我,如果有處理這樣的數據的最佳做法?這似乎是一個常見的財務問題。我確信我可以刪除' - ',然後如果發現將它附加到前面,但我想要處理這個問題的最佳方式的輸入。

回答

5

要提供完整的答案,我們需要知道值的格式,除了varchar2字段中的'5'之外。 (請更新你的問題。)

下列任一將轉換爲「5」的數字-5:

to_number('5-', '9S') 
to_number('5-', '9MI') 
  1. 如果你能有一個以上的數字,花枝招展的數量必須增加。
  2. 如果您有分隔符,例如逗號,則必須將其考慮在內。
  3. 對於'9S'格式,必須爲正數提供加號。 (數字5需要'5+',因爲'5'和'5'會引發錯誤。)對於'9MI'格式,必須爲正數提供空格。 ('5'是可以接受的,但'5'會引發錯誤)。
  4. 如果同一列的值爲'-5'和'5'格式,這將不起作用。如果只有幾個'9999-'的數字會拋出你,其餘的所有數據都可以使用你現有的方法進行轉換,我會測試最後一個字符以判斷它是否爲負數,如果是這樣的話,將其轉換成其他數字,並乘以-1:

    Table dropped. 
    
    SQL> create table t (v varchar2(10)); 
    
    Table created. 
    
    SQL> insert into t values ('-5'); 
    
    1 row created. 
    
    SQL> insert into t values ('5-'); 
    
    1 row created. 
    
    SQL> insert into t values ('9999-'); 
    
    1 row created. 
    
    SQL> insert into t values ('5'); 
    
    1 row created. 
    
    SQL> select v 
        2  , case when substr(v, length(v)) = '-' 
        3   then -1 * cast(substr(v, 1, length(v) - 1) as number) 
        4   else cast(v as number) end as V_NUM 
        5 from t; 
    
    V    V_NUM 
    ---------- ---------- 
    -5     -5 
    5-     -5 
    9999-   -9999 
    5     5 
    
    SQL> spool off 
    
+0

意想不到的答案。數據範圍是單個數字(0-9),有或者沒有+或 - 我將合併來自3個不同來源的數據,因此它不完全統一。謝謝你的建議。這非常有幫助。 – 2010-07-14 19:59:51

相關問題