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 中不起作用