select
a.id,
max
(text) text,
sum
(regexp_substr(add_text,
'[0-9]+'
,
1
,n)
--
依次找出第
N
个数字
*
decode(regexp_substr(
'+'
||add_text,
'[^0-9]'
,
1
,n),
'+'
,
1
,-
1
))
--
依次找出
+|-
,然后在后面的数字上乘以系数
--
以上
sum
计算了所有
+|-
运算的总合计值
+
nvl(
sum
((
select
decode(substr(regexp_substr(
'+'
||text,
'[+|-]([0-9]+[*|/]+)+[0-9]+'
,
1
,n),
1
,
1
),
'+'
,
1
,-
1
)
--
找出
+|-
开头,并紧跟数字、
[*|/]
、数字的部分,依次根据第一位来判定系数
*
power(
10
,
Sum
(
Log
(
10
,decode(regexp_substr(
'*'
||regexp_substr(text,
'([0-9]+[*|/]+)+[0-9]+'
,
1
,n),
'[^0-9]'
,
1
,
rownum
),
--
找出第
n
个数字、
[*|/]
、数字相连的部分
--
排除数字,找出前面找到的部分中的第
rownum
个非数字的字符
(
最前面加
*)
'*'
,
regexp_substr(regexp_substr(text,
'([0-9]+[*|/]+)+[0-9]+'
,
1
,n),
'[0-9]+'
,
1
,
rownum
),
--
如果是
'*'
则,则直接找到
*
后面的数字部分
1
/regexp_substr(regexp_substr(text,
'([0-9]+[*|/]+)+[0-9]+'
,
1
,n),
'[0-9]+'
,
1
,
rownum
)
--
如果不是
'*'(
即
/)
,则用
1/NUM
))))
--
外层通关
LOG
和
POWER
函数,把乘除法转换为加减法
from
dual
connect
by
rownum
<=len)
--
在这里再做一层循环,用于计算乘除法
) ,
0
) wanted
from
(
select
a.id,
a.text,
length(regexp_replace(text,
'[0-9]+'
))+
1
len,
--
去掉数字计算运算符个数
regexp_replace(text,
'([0-9]+[*|/]+)+[0-9]+'
,
0
) add_text
--
将
*|/
操作的数均用
0
代替
from
t_mar a) a,
(
select
rownum
n
from
dual
connect
by
rownum
<
100
) b
where
a.len>=b.n
--
可以直接形成从
1
到
a.len
的循环操作
group
by
id
order
by
id
;