我不明白为什么隐式转换对 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()
,但也许开销太大,或者一些实现原因导致它很困难,或者他们计划尝试转换为日期;或者也许它只是被忽视了。
该部分的措辞仍然是错误的;第一段指出它采用数字或日期时间值,因此第二段仅引用数字无论如何都是不正确的。看起来第二段的第一句话不应该存在,其余的也应该适用于日期时间,至少在返回类型方面。
文档中左侧导航面板底部有一个反馈按钮。您可以在那里报告它,然后查看文档是否更新。
或者,您可以提出服务请求以更改行为以匹配文档 - 尽管该段落仍然需要一些工作......