AVG 中的 TO_NUMBER 函数不起作用

Posted

技术标签:

【中文标题】AVG 中的 TO_NUMBER 函数不起作用【英文标题】:TO_NUMBER function inside AVG doesn't work 【发布时间】:2019-09-24 13:32:32 【问题描述】:

TO_NUMBER ORACLE 函数有问题。

查询

SELECT TO_NUMBER(varchar2_column)
FROM TABLE@ANOTHER_DB;

有效,但如果我将TO_NUMBER 放入AVG,ORACLE 会返回以下错误:

ORA-01722:无效编号 ORA-02063:ANOTHER_DB 位置的前一行:0

查询如下:

SELECT AVG(TO_NUMBER(varchar2_column))
FROM TABLE@ANOTHER_DB;

有人可以帮我吗?提前致谢

【问题讨论】:

问题是,远程表中有非数字数据。您不会收到错误,因为正常的选择语句只获取一些记录而不是孔表。问题是,你想对无效数据做什么...... 您的实际查询中是否有where 子句?当您只使用to_number 运行查询时,您是否获取了所有数据?还是只有前几页数据? table@another_db 真的是一张桌子吗?还是景色?列中是否有非数字数据?如果是这样,您想如何使用字符串“abc”处理平均数字?将其视为NULL? 0?还有什么? 该错误是由于该列中的某些数据无法转换为数字。 如果你有一个实际的数据库版本,你可以试试SELECT AVG(TO_NUMBER(varchar2_column DEFAULT NULL ON CONVERSION ERROR)) FROM TABLE@ANOTHER_DB 我读到 NULL 值被 AVG 跳过...我知道表中可能是像“90.0”这样的值,这些值是否有效? 【参考方案1】:

您可以使用以下查询来获取数据的工作格式掩码:

SELECT AVG(TO_NUMBER(varchar2_column, 'FM'||REGEXP_REPLACE(varchar2_column,'\d','0'))) 
  FROM TABLE@ANOTHER_DB;

这将生成一个格式掩码,将所有数字字符替换为 0,这应该适用于您的所有数据。

【讨论】:

我做了一个 REPLACE 操作(将 '.' 替换为 ',')。你觉得好看吗? 我不会这样做,因为这取决于可能不同的 NLS 设置。当您运行您的应用程序时,. 是不起作用的十进制字符。如果你愿意,你可以用SELECT substr(value,1,1) from nls_session_parameters WHERE PARAMETER = 'NLS_NUMERIC_CHARACTERS' 替换它...

以上是关于AVG 中的 TO_NUMBER 函数不起作用的主要内容,如果未能解决你的问题,请参考以下文章

函数中的基本算术不起作用

.scroll 函数中的 .offset 函数在 jQuery 中不起作用

$.extend 中的 AJAX 函数在 jQuery 3 中不起作用

外部函数中的嵌套函数更改变量不起作用

XCUITest:调用的测试函数中的断言不起作用

如果用户定义函数中的语句不起作用