【问题标题】:Dynamic length on number format in to_number Oracle SQLto_number Oracle SQL中数字格式的动态长度
【发布时间】:2013-11-26 16:00:13
【问题描述】:

我有一个表格,其中的数字存储为varchar2,带有“。”作为小数点分隔符(例如“5.92843”)。

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

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

我的问题是一些数字可能很长,因为字段是VARCHAR2(100),当它比我定义的格式长时,我的to_number 失败并显示ORA-01722

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

【问题讨论】:

  • 这个问题的好解决方案:stackoverflow.com/a/4143834/603516
  • 偶然地,今天我为这个问题找到了一个更简单的解决方案(请参阅我的答案)。抱歉 - 这对解决此问题没有帮助:虽然“TM9”适用于 TO_CHAR,但不适用于 TO_NUMBER。

标签: sql oracle nls


【解决方案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    

【讨论】:

  • 谢谢:)。我选择了这个解决方案。它还确保我的程序中的任何其他计算都使用我选择的小数分隔符。
【解决方案2】:

您不能拥有“无限”号码。最大精度为 38 位有效数字。来自documentation

【讨论】:

  • Alen,OP 似乎在谈论动态格式掩码,而不是 无限 精度。
【解决方案3】:

您可以尝试以下方法之一(将它们作为一个想法,因为我没有在这里尝试它的数据库):

1) 使用不带格式的 TO_NUMBER。根据Oracle docs,它使用点作为小数分隔符。

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

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 默认使用的字符。

【讨论】:

    猜你喜欢
    • 2021-07-22
    • 1970-01-01
    • 2016-06-28
    • 2020-11-28
    • 2017-12-19
    • 2016-09-14
    • 2018-08-20
    • 1970-01-01
    • 2016-04-14
    相关资源
    最近更新 更多