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

to_number Oracle SQL中数字格式的动态长度,sql,oracle,nls,Sql,Oracle,Nls,我有一个表,其中的数字存储为varchar2,以“.”作为十进制分隔符(例如“5.92843”) 我想使用“,”来计算这些数字,因为这是系统默认值,并使用以下来计算这些数字: TO_NUMBER(number,'99999D9999','NLS_NUMERIC_CHARACTERS = ''.,''') 我的问题是有些数字可能很长,因为字段是VARCHAR2(100),当它比我定义的格式长时,我的to_number会失败,出现ORA-01722 有没有办法定义一个动态数字格式? 我真的不在乎格

我有一个表,其中的数字存储为
varchar2
,以“.”作为十进制分隔符(例如“5.92843”)

我想使用“,”来计算这些数字,因为这是系统默认值,并使用以下
来计算这些数字:

TO_NUMBER(number,'99999D9999','NLS_NUMERIC_CHARACTERS = ''.,''')
我的问题是有些数字可能很长,因为字段是
VARCHAR2(100)
,当它比我定义的格式长时,我的
to_number
会失败,出现
ORA-01722

有没有办法定义一个动态数字格式? 我真的不在乎格式,只要我可以设置我的十进制字符

有没有办法定义一个无限制的数字格式

唯一的方法是为
nls\u numeric\u characters
参数会话范围设置适当的值,并使用
to\u 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    

你不能有“无限”号码。最大精度为38位有效数字。从.

中,您可以尝试以下方法之一(将其视为一个想法,因为我在这里没有用于尝试的DB):

1) 用于不带格式的数字。根据它使用的小数点分隔符,然后

如果您的号码包含组分隔符,请先删除这些分隔符,然后转换:

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,将您的组字符(此处:逗号)和十进制分隔符(此处:点)转换为Oracle默认使用的数字。

Alen,似乎OP谈论的是动态格式掩码,而不是无限精度。谢谢:)。我选择了这个解决方案。它还确保了我的过程中的任何其他计算都使用我选择的十进制分隔符。这个问题的好解决方案:碰巧,今天我为这个问题找到了一个更简单的解决方案(见我的答案)。抱歉-这无助于解决此问题:“TM9”适用于TO_CHAR,但不适用于TO_NUMBER。