我有一个表格,其数字存储为varchar2
和'。'作为小数分隔符(例如'5.92843')。
我想使用','来计算这些数字,因为这是系统默认值,并使用以下to_number
来执行此操作:
TO_NUMBER(number,'99999D9999','NLS_NUMERIC_CHARACTERS = ''.,''')
我的问题是某些数字可能很长,因为字段为VARCHAR2(100)
,当字段长于我定义的格式时,我的to_number
会失败并显示ORA-01722
。< / p>
有什么办法可以定义动态数字格式吗? 只要我能设置十进制字符,我就不关心格式。
答案 0 :(得分:2)
有什么方法可以定义无限数字格式吗?
唯一的方法是为nls_numeric_characters
参数会话范围设置适当的值,并使用to_number()
函数而不指定格式掩码。
这是一个简单的例子。十进制分隔符是逗号","
,数字文字包含句点"."
作为小数分隔符:
SQL> show parameter nls_numeric_characters;
NAME TYPE VALUE
------------------------------------ ----------- ------
nls_numeric_characters string ,.
SQL> with t1(col) as(
2 select '12345.567' from dual union all
3 select '12.45' from dual
4 )
5 select to_number(col) as res
6 from t1;
select to_number(col)
*
ERROR at line 5:
ORA-01722: invalid number
SQL> alter session set nls_numeric_characters='.,';
Session altered.
SQL> with t1(col) as(
2 select '12345.567' from dual union all
3 select '12.45' from dual
4 )
5 select to_number(col) as res
6 from t1;
res
--------------
12345.567
12.45
答案 1 :(得分:0)
你不能拥有“无限”号码。最高精度为38位有效数字。来自documentation。
答案 2 :(得分:0)
您可以尝试以下方法之一(将它们用于创意,因为我没有在此处尝试使用数据库):
1)使用没有格式的TO_NUMBER。根据{{3}},它使用一个点作为小数分隔符。
如果您的号码包含组分隔符,请先删除它们然后转换:
TO_NUMBER(TRANSLATE(number, ',''' ,''))
2)从输入中生成数字格式:
select TO_NUMBER(n, TRANSLATE(n,' 1,234.567890',TO_CHAR(9999.9, '9G999D9')||'99999'))
from (select '9,876.54' as n from dual);
后者将所有数字转换为9,您的组字符(此处为逗号)和小数点分隔符(此处为:dot)默认为Oracle使用的数字。