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 类型而言。
在文档的左侧导航面板底部有一个反馈按钮。你可以在那里报告,然后看看文档是否更新过。
或者,您可以提出服务请求以更改行为以匹配文档 - 尽管该段落仍需要一些工作...
我不明白为什么隐式转换对 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 类型而言。
在文档的左侧导航面板底部有一个反馈按钮。你可以在那里报告,然后看看文档是否更新过。
或者,您可以提出服务请求以更改行为以匹配文档 - 尽管该段落仍需要一些工作...