Oracle:将"5-"存储为数字

Jam*_*ins 0 sql oracle plsql

简短版本:将"5-"作为一个数字转换为表格作为数字的最佳方法是什么?

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

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

Sha*_*nce 5

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

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

to_number('5-', '9S')
to_number('5-', '9MI')
Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)