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



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

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

我可以这样做:

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:参数应该是数字或日期/日期时间类型。

关于MEDIAN 的 Oracle 文档说隐式转换已完成:

此函数将任何数值数据类型或任何 可隐式转换为数字的非数字数据类型 数据类型。

这与AVG上的Oracle文档完全相同。

而:

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())允许传递任一数据类型,也允许将字符串隐式转换为数字 - 但不允许将日期转换为日期。但是这些函数往往在文档中以不同的参数类型列出两次,并且是单行函数;随手我想不出任何表现这样的聚合。

avg()可以说是可以进行隐式转换,因为传入的所有内容都必须可转换为数字。他们本可以只尝试像trunc()一样隐式转换为数字median(),但也许开销太大,或者一些实现原因导致它很困难,或者他们计划尝试转换为日期;或者也许它只是被忽视了。

该部分的措辞仍然是错误的;第一段指出它采用数字或日期时间值,因此第二段仅引用数字无论如何都是不正确的。看起来第二段的第一句话不应该存在,其余的也应该适用于日期时间,至少在返回类型方面。

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

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

最新更新