to_number Oracle SQL中数字格式的动态长度

时间:2013-11-25 15:28:05

标签: sql oracle nls

我有一个表格,其数字存储为varchar2和'。'作为小数分隔符(例如'5.92843')。

我想使用','来计算这些数字,因为这是系统默认值,并使用以下to_number来执行此操作:

TO_NUMBER(number,'99999D9999','NLS_NUMERIC_CHARACTERS = ''.,''')

我的问题是某些数字可能很长,因为字段为VARCHAR2(100),当字段长于我定义的格式时,我的to_number会失败并显示ORA-01722。< / p>

有什么办法可以定义动态数字格式吗? 只要我能设置十进制字符,我就不关心格式。

3 个答案:

答案 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使用的数字。