不能求和(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]的主要内容,如果未能解决你的问题,请参考以下文章