sql的加减乘除运算_实现四则运算的一条sql语句

感谢各位版主和坛友的鼓励,格式了一下代码

算法就是

将       '12+556-543*152/2423+23*2*435+34-234'

变成2部分  '12+556-                       0+              0+34-234'

和  -543*152/2423 ;23*2*435

分别计算求和

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)) +                                                                            --加法的数字求和,乘法和除法分开计算 ,取每个子串前的运算符号,如果为 ‘-’就 乘以-1

sum((select decode(substr(regexp_substr('+' || text,

'[+|-]([0-9]+[*|/]+)+[0-9]+',

1,

n),

1,

1),

'+',

1,

-1) *                                                                   -- 如 25*515/544  子串前的运算符号,如果为 ‘-’就 乘以-1

power(10,                                                                  -- 从itpub上学到的 利用lg将 连乘 改为加法

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)) 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 mar_test a) a,

(select rownum n from dual connect by rownum < 100) b                 --默认算式最多数字100个

where a.len >= b.n

group by id

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值