|
|
的确有这个问题,我把 加减 和 乘除分开计算, 如果没有乘除,乘除部分就是null ,结果 就是null 了,
需要 用nvl判断null 变换为0,十分感谢gkl0818
select a.id,max(text) text,
sum(regexp_substr(add_text,'[0-9]+',1,n)*decode(regexp_substr('+'||add_text,'[^0-9]',1,n),'+',1,-1))
+
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),
'*', 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)
) ) ) )
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
from mar_test a ) a,
(select rownum n from dual connect by rownum<100) b
where a.len>=b.n
group by id |
|