Oracle 中值函数隐式转换为数字失败

Failure of implicit conversion to number in median function in Oracle

我不明白为什么隐式转换对 Oracle 中的中值函数不起作用。 (显然我有很多方法可以通过适当的显式转换来解决它,但我想知道为什么会发生这种情况。我是否遗漏了一些明显的东西或者这是一个错误?它似乎不太可能是一个错误。)

我有一个带有 varchar2(255 字节)列的 table。它可以为空,但不包含空值。此字段中的所有字符串都是数字。

我能做到:

select avg(this_field) from this_table

没关系。

我能做到:

select median(to_number(this_field)) from this_table

这也很好。

但是我做不到:

select median(this_field) from this_table

因为我收到错误 "ORA-30495: The argument should be of numeric or date/datetime type."

Oracle documentation on MEDIAN表示隐式转换完成:

This function takes as arguments any numeric data type or any nonnumeric data type that can be implicitly converted to a numeric data type.

这与 Oracle documentation on AVG.

的措辞完全相同

还有:

select median(to_char('1')) from dual;
ORA-30495: The argument should be of numeric or date/datetime type.

select avg(to_char('1')) from dual;
1

select median(to_number(to_char('1'))) from dual;
1

那么……怎么回事?

这似乎是一个文档错误(可以追溯到它在 10gR1 中首次引入时)。我想无论是谁写的,都是从另一个函数(如 avg)复制粘贴的,并且没有删除不适用于 median.

的位

某些函数,如 trunc()round(),允许传递任何一种数据类型,并且还允许将字符串隐式转换为数字 - 但在我的测试中不允许转换为日期。但是那些往往在文档中以不同的参数类型列出两次,并且是 single-row functions;副手我想不出有任何行为像那样的聚合。

avg() 可以说是隐式转换,因为传入的所有内容都必须可以转换为数字。他们本可以让 median() 只尝试隐式转换为 trunc() 之类的数字,但也许开销太大,或者一些实现困难的原因,或者他们计划尝试转换为日期出色地;或者它可能只是被忽略了。

那一节的措辞仍然是错误的;第一段说明它采用数字或日期时间值,因此第二段仅引用数字无论如何都是不正确的。看起来第二段的第一句不应该存在,其余部分也应该适用于日期时间,至少就 return 类型而言。

在文档的左侧导航面板底部有一个反馈按钮。你可以在那里报告,然后看看文档是否更新过。

或者,您可以提出服务请求以更改行为以匹配文档 - 尽管该段落仍需要一些工作...