CNET中国旗舰网站

ZDNet China | CNET科技资讯网 | 政府采购 | 行业网站联盟





 
标题: [转贴] 实现四则运算的一条sql语句
叛逆的鲁鲁修
支柱会员
Rank: 10Rank: 10Rank: 10



UID 320136
精华 0
积分 15945
帖子 1387
威望 7334
ZD币 1850 元
阅读权限 210
注册 2008-4-18
状态 离线
  楼主
发表于 2008-11-4 13:34  资料  个人空间  短消息  加为好友 
开发者在线

实现四则运算的一条sql语句

1.建立一个测试表
create table mar_test( id number, text varchar2(200))
      
      insert into mar_Test values ( 1,'12+556-543*152/2423+23*2*435+34-234');
      insert into mar_Test values ( 2,'12/2/3/4');
      insert into mar_Test values ( 3,'1*2*34');
      insert into mar_Test values ( 4,'1+5-5*2/5+3*2*4*5+34-2');

   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

sql 实现对 text中算式的计算 ,限制就是不能加括号
运算结果
ID        TEXT                                                                        WANTED
1        12+556-543*152/2423+23*2*435+34-234        20343.93644
2        12/2/3/4                                                                        0.5
4        1+5-5*2/5+3*2*4*5+34-2                                        156
3        1*2*34                                                                        68

以前如果算式只有加减没有乘除,结果为null,是以前考虑不周, 现在对乘除部分计算之和加上nvl判断




顶部
 



当前时区 GMT+8, 现在时间是 2009-7-5 06:46

  Powered by Discuz! 5.5.0 © 2001-2007 Comsenz Inc.
Processed in 0.066533 second(s), 3/3 queries

清除 Cookies - 联系我们 - ZDNetChina中文社区 - 无图版