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