2017-04-13 37 views
1

我不明白爲什麼隱式轉換對於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:參數應該是數字或日期/時間類型」。

Oracle documentation on MEDIAN的說,隱式轉換完成:

此函數採用作爲參數的任何數字數據類型或可隱式轉換爲數字 數據類型的任何 非數值數據類型。

這與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 

所以......這是怎麼回事?

回答

2

這似乎是一個文檔錯誤(可以追溯到它在10gR1中首次引入時)。我想象那些從avg之類的其他函數複製並粘貼的人,並且沒有拿出不適用於median的位。

一些功能,如trunc()round(),允許傳遞任何數據類型,並允許在我的測試中將字符串隱式轉換爲數字 - 但不是日期。但是這些通常會在具有不同參數類型的文檔中列出兩次,並且是single-row functions;我無法想象任何表現如此的集合。

avg()可以說可以做隱式轉換,因爲所有通過的內容都必須可以轉換爲數字。他們本可以讓median()只嘗試隱含地轉換爲像trunc()這樣的數字,但也許有太多的開銷,或者一些實現原因,爲什麼它很難,或者他們計劃嘗試轉換爲日期;或者它可能被忽略了。

該部分的措辭仍然是錯誤的;第一段指出它需要一個數字或日期時間值,所以對於第二個只能引用數字將是不正確的。看起來第二段的第一句話不應該在那裏,其餘的也應該適用於日期時間,至少在返回類型方面。

文檔左側導航面板底部有一個反饋按鈕。您可以在那裏報告,然後查看文檔是否更新過。

或者,你可以提出一個服務請求得到改變以匹配文檔的行爲 - 雖然那款仍然需要一些工作......

+0

哈,謝謝有道理!謝謝,我會報告它。 –