考虑我有以下数据
Name Fee
Student1 Fee paid : 100rs
Student2 Fee paid : 500rs
Student3 Fee paid : 200rs
我需要选择费用列的 max,min和avg 值,需要拆分:和rs delimiter
例如这里 结果是
Min Max Avg
100 500 250
答案 0 :(得分: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
)
regexp_substr
的6 th 参数(自Oracle 11g起可用)允许您仅返回捕获组匹配的文本(在本例中为\d+
)。
正则表达式要求:
可选地后跟空格(\s*
),然后有一些数字(\d+
),再次跟随可选的白色空格,随后rs
。
请注意,从文本列中检索金额会破坏结构化数据库的任何优势:该列上的索引不会被使用,而使用正则表达式的提取会带来开销。
在规范化的关系数据库设计中,字段仅包含原子数据,而不包含任何其他内容。因此,在这种情况下,fee
列应仅包含数量,并且应为数值数据类型。您需要了解的有关费用的任何其他信息应存储在不同的列中。