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

标签 sql oracle nls

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

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

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

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

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

最佳答案

Is there any way I can define an unlimited number format?

唯一的方法是在 session 范围内为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    

关于sql - to_number Oracle SQL 中数字格式的动态长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20196816/

相关文章:

oracle - 按字母顺序对 varchar2 中的字符进行排序

r - 防止 nls-fit 低于零

mysql - 从 SQL hasmany 关系构造嵌套对象图

php - 使用 php 和 sql 创建一个下拉列表,根据之前的选择给出值

java - 向 SQL 表添加用户定义的约束

r - R : determining coefficients for nls

R - 使用嵌套数据框运行具有不同参数集的函数

sql - 使用 Node.js 和 sqlite3 添加具有多列的行

c# - 为什么这个查询给我 "Object reference not set to an instance of an object"?

sql - ORA-00913 : too many values in oracle subquery