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

时间:2016-05-27 08:42:34

标签: oracle casting varchar2

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

在发生此错误之前我使用了SUM(TO_NUMBER(REGEXP_REPLACE(BIKOU,'[[:alpha:]]', '')))并且它可以正常工作但是上周我在myfield中放了一些小数值,所以此代码不再有用了。

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

1 个答案:

答案 0 :(得分:2)

如果您从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

面具显然必须适合您期望从正则表达式返回的所有值;我用过的东西可能不太适合您的数据。

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