简短版本:将"5-"作为一个数字转换为表格作为数字的最佳方法是什么?
长版:这是问题,我有一个表,我正在读取由VARCHAR2组成的主要表.我从一些字段中获取数据并将其存储在另一个表中而不进行修改.在一个字段中,我得到"5-"并试图将其存储在NUMBER字段中,该字段抛出错误,因为它无法将其转换为数字.
谁能告诉我是否有最佳实践来处理这样的数据?这似乎是一个常见的财务问题.我相信我可以删除'-'s然后如果发现它贴在前面但我想输入最好的处理方法.
为了提供完整的答案,我们需要知道值的格式,除了varchar2字段中的'5'之外.(请更新你的问题.)
以下任一项都会将"5"转换为数字-5:
to_number('5-', '9S')
to_number('5-', '9MI')
Run Code Online (Sandbox Code Playgroud)
'9S'格式的情况下,必须为正数提供加号.(数字5需要为'5+',因为'5'和'5'将引发错误.)对于'9MI'格式,必须为正数提供空格.('5'是可以接受的,但'5'会引发错误).如果相同的列具有"-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)