2016-07-30 49 views
0

讓我們考慮,我有以下數據拆分列,並找到最小值,最大值和平均價值在Oracle查詢

Name  Fee 
Student1 Fee paid : 100rs 
Student2 Fee paid : 500rs 
Student3 Fee paid : 200rs 

,我需要選擇最大,最小和平均費列的值需要分割來源:和RS分隔符

例如,下面 結果是

Min  Max  Avg 
100  500  250 
+0

這個問題有什麼*姓名*列? – trincot

+2

未來,您應該不會像這樣存儲數據。將數字數據存儲在其自己的數字列中。做一個字符串拆分來從列中獲得任何有意義的內容並不是一個很好的設計決策。 – Kritner

回答

2

你可以使用正則表達式爲:

select min(fee_num), max(fee_num), avg(fee_num) 
from (
     select to_number(regexp_substr(fee, ':\s*(\d+)\s*rs', 1, 1, null, 1)) fee_num 
     from mytable 
    ) 

的6個參數regexp_substr(可用自的Oracle 11g),可以僅返回由捕獲組匹配的文本(即在這種情況下爲\d+)。

正則表達式需要:被任選接着進行空白(\s*),那麼有一些位(一個或多個)(\d+),隨後再次可選空格,與rs以下這一點。

請注意,從文本列中檢索數量會損害您可能從結構化數據庫中獲得的任何優勢:不會使用該列上的索引,並且使用正則表達式提取會帶來開銷。

在規範化的關係數據庫設計中,一個字段只包含原子數據,而不包含其他任何內容。所以在這種情況下,fee列應該只包含數量並且是數字數據類型。您需要知道的有關費用的任何其他信息應存儲在不同的欄中。

相關問題