不能求和(TO_NUMBER(varchar2 字段)):ORA 01722 [ORACLE]

Posted

技术标签:

【中文标题】不能求和(TO_NUMBER(varchar2 字段)):ORA 01722 [ORACLE]【英文标题】:Cannot SUM(TO_NUMBER(varchar2 field)) :ORA 01722 [ORACLE] 【发布时间】:2016-05-27 08:42:33 【问题描述】:

我有 myfield 作为 varchar2 类型,我尝试使用 sum(to_number(myfield)) 对这个字段求和,但结果是 ORA-01722 无效数字。

在发生此错误之前,我使用了 SUM(TO_NUMBER(REGEXP_REPLACE(BIKOU,'[[:alpha:]]', ''))),它可以工作,但上周我在 myfield 中输入了一些十进制值,因此此代码不再工作。

这是我在 myfield 中的数据示例 10,12,13.5,NULL

【问题讨论】:

为什么需要那个 regexp_replace?这意味着“X1X2X3X4XX”将是 1234,你真的想要这个吗? nls_numeric_characters 设置为什么? 从不varchar列中存储数字。改为修复您的表格设计。 我只想将存储为 varchar2 的数值相加 关键是,如果您为您的列使用了正确的数据类型,您一开始就不需要使用这样的技巧。不过,您需要清楚数值的含义;正如 Aleksej 所说,您的代码会将混合字符串中的任何数字视为数字,这可能不是您想要的; '13.5' 对你来说算数吗?那么“13,5”或“1,000.5”或“1.000,5”呢? 【参考方案1】:

如果您从 13.5 之类的字符串中收到该错误,那么您会话的 NLS_NUMERIC_CHARACTERS 似乎设置为使用逗号作为小数分隔符:

alter session set nls_numeric_characters=',.';

with your_table (bikou) as (
  select '10' from dual
  union all select '12' from dual
  union all select '13.5' from dual
  union all select null from dual
)
select SUM(TO_NUMBER(REGEXP_REPLACE(BIKOU,'[[:alpha:]]', '')))
from your_table;

SQL Error: ORA-01722: invalid number

您可以将会话显式设置为使用句点作为小数分隔符,或者提供使用句点的格式掩码:

select SUM(TO_NUMBER(REGEXP_REPLACE(BIKOU,'[[:alpha:]]', ''), '99999999.99999'))
from your_table;

SUM(TO_NUMBER(REGEXP_REPLACE(BIKOU,'[[:
---------------------------------------
                                   35,5

或者在模型中使用小数点分隔符并覆盖会话的 NLS 设置:

select SUM(TO_NUMBER(REGEXP_REPLACE(BIKOU,'[[:alpha:]]', ''),
  '99999999D99999', 'nls_numeric_characters=''.,'''))
from your_table;

SUM(TO_NUMBER(REGEXP_REPLACE(BIKOU,'[[:
---------------------------------------
                                   35,5

掩码显然必须适合您期望从正则表达式返回的所有值;我使用的可能不太适合您的数据。

这种问题就是为什么您不应该将数字或日期存储为字符串。为您的列使用正确的数据类型。

【讨论】:

以上是关于不能求和(TO_NUMBER(varchar2 字段)):ORA 01722 [ORACLE]的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 11.2 to_number 多个逗号

AVG 中的 TO_NUMBER 函数不起作用

在oracle中将varchar2转换为数字

oracle中varchar2类型与integer类型的变量进行运算

Oracle怎样把varchar2型转成number型

mysql varchar 最大可以设定多少