select
a.id,
??????
max
(text) text,
??????
sum
(regexp_substr(add_text,
'[0-9]+'
,
1
,n)
--
依次找出第
N
個數(shù)字
?????????? *
?????????? decode(regexp_substr(
'+'
||add_text,
'[^0-9]'
,
1
,n),
'+'
,
1
,-
1
))
--
依次找出
+|-
,然后在后面的數(shù)字上乘以系數(shù)
??????
--
以上
sum
計算了所有
+|-
運算的總合計值
?????? +
?????? nvl(
sum
((
select
decode(substr(regexp_substr(
'+'
||text,
'[+|-]([0-9]+[*|/]+)+[0-9]+'
,
1
,n),
1
,
1
),
'+'
,
1
,-
1
)
????????????????????????????????????
--
找出
+|-
開頭,并緊跟數(shù)字、
[*|/]
、數(shù)字的部分,依次根據(jù)第一位來判定系數(shù)
?????? *
?????? power(
10
,
Sum
(
Log
(
10
,decode(regexp_substr(
'*'
||regexp_substr(text,
'([0-9]+[*|/]+)+[0-9]+'
,
1
,n),
'[^0-9]'
,
1
,
rownum
),
????????????????????????????????????????????????????
--
找出第
n
個數(shù)字、
[*|/]
、數(shù)字相連的部分
?????????????????????????????????
--
排除數(shù)字,找出前面找到的部分中的第
rownum
個非數(shù)字的字符
(
最前面加
*)
?????????????????????????
???????
'*'
,
????????????????????????????????? regexp_substr(regexp_substr(text,
'([0-9]+[*|/]+)+[0-9]+'
,
1
,n),
'[0-9]+'
,
1
,
rownum
),
?????????????????????????????????
--
如果是
'*'
則,則直接找到
*
后面的數(shù)字部分
?????????????????????????????????
1
/regexp_substr(regexp_substr(text,
'([0-9]+[*|/]+)+[0-9]+'
,
1
,n),
'[0-9]+'
,
1
,
rownum
)
?????????????????????????????????
--
如果不是
'*'(
即
/)
,則用
1/NUM
????????????????????????????????? ))))
??????
--
外層通關(guān)
LOG
和
POWER
函數(shù),把乘除法轉(zhuǎn)換為加減法
??????
from
dual
connect
by
rownum
<=len)
--
在這里再做一層循環(huán),用于計算乘除法
?????? ) ,
0
) wanted
?
from
?
?????? (
select
a.id,
?????????????? a.text,
?????????????? length(regexp_replace(text,
'[0-9]+'
))+
1
len,
--
去掉數(shù)字計算運算符個數(shù)
?????????????? regexp_replace(text,
'([0-9]+[*|/]+)+[0-9]+'
,
0
) add_text
--
將
*|/
操作的數(shù)均用
0
代替
?????????
from
t_mar a) a,
?????? (
select
rownum
n
from
dual
connect
by
rownum
<
100
) b
?
where
a.len>=b.n
--
可以直接形成從
1
到
a.len
的循環(huán)操作
?
group
by
id
?
order
by
id
;