Oracle:将“5-”存储为数字

时间:2010-07-14 18:47:15

标签: sql oracle plsql

简短版本: 将“5-”作为数字转换成数字表的最佳方法是什么?

长版: 这是问题,我有一个表,我正在读取由VARCHAR2组成的主要表。我从一些字段中获取数据并将其存储在另一个表中而不进行修改。在一个字段中,我得到“5-”并试图将其存储在NUMBER字段中,该字段会抛出错误,因为它无法将其转换为数字。

有人能告诉我是否有最佳实践来处理此类数据?这似乎是一个常见的财务问题。我相信我可以删除'-'s然后如果发现它贴在前面但我想输入最好的处理方法。

1 个答案:

答案 0 :(得分:5)

为了提供完整的答案,除了varchar2字段中的'5'之外,我们还需要知道值的格式。 (请更新您的问题。)

以下任一项都会将“5”转换为数字-5:

to_number('5-', '9S')
to_number('5-', '9MI')
  1. 如果您可以有多个数字,则必须增加9个数。
  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