小编典典

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

sql

我有一张桌子,上面存储着varchar2与“。”相同的数字。作为小数点分隔符(例如“ 5.92843”)。

我想使用’,’来计算这些数字,因为这是系统默认值,并且已使用以下to_number方法进行了此操作:

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

我的问题是,某些数字可能非常长,因为该字段是如此VARCHAR2(100),并且当它长于我定义的格式时,我将to_number失败并显示ORA-01722

有什么方法可以定义动态数字格式?只要设置十进制字符,我就不会真正在意格式。


阅读 231

收藏
2021-04-14

共1个答案

小编典典

有什么方法可以定义无限制的数字格式?

唯一的方法是在不指定格式掩码的情况下为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
2021-04-14