在一个表内,如何把一格内的数值相加??

pk167 2008-11-12 02:31:00
Table T01

SEQ NAME SALARY
-----------------------
1 AAA 1000+1100+1200
2 BBB 2000
3 CCC 1110+2000
4 DDD 2000+2200+2400+2600

我想要的结果是:

SEQ NAME SALARY
-----------------------
1 AAA 3300
2 BBB 2000
3 CCC 3110
4 DDD 9200

请问有办法吗?
...全文
277 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
icss_zhen 2008-11-13
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 BlueskyWide 的回复:]
SQL code
--给楼主做出来了,自已定义了一个f_add_char()函数:

SQL> select * from t01;

SEQ NAME SALARY
---------- -------- ------------------------------
1 AAA 1000+1100+1200
1 BBB 2000
1 CCC 1100+2000
1 DDD 2000+2200+2400+2600

SQL>
SQL> CREATE OR REPLACE FUNCTION f_add_char(field_name IN varchar2) RETURN varchar2 …
[/Quote]这个方法学习了,不过我觉的里面不需要都循环100次,可以改为

CREATE OR REPLACE FUNCTION F_ADD_CHAR(FIELD_NAME IN VARCHAR2)
RETURN VARCHAR2 IS
V_STR_ADD VARCHAR2(80) := '';
V_ADD_NUMBER NUMBER := 0;
V_1 VARCHAR2(80) := '';
V_LENGTH INTEGER;
BEGIN
SELECT LENGTH(FIELD_NAME) INTO V_LENGTH FROM DUAL;
FOR I IN 1 .. V_LENGTH + 1 LOOP
IF ASCII(SUBSTR(FIELD_NAME, I, 1)) = 43 OR I = V_LENGTH + 1 THEN
V_ADD_NUMBER := V_ADD_NUMBER + TO_NUMBER(V_1);
V_1 := '';
ELSE
V_1 := V_1 || SUBSTR(FIELD_NAME, I, 1);
END IF;
END LOOP;
V_STR_ADD := TO_CHAR(V_ADD_NUMBER);
RETURN V_STR_ADD;
END;
测试结果如下:
select F_ADD_CHAR('1000+1100+1200') from dual;--3300
select F_ADD_CHAR('1000+1100+1200+1000') from dual;--4300
select F_ADD_CHAR('1000+1100') from dual;--2100
select F_ADD_CHAR('1000') from dual;--1000

chentony 2008-11-13
  • 打赏
  • 举报
回复
學習 
BlueskyWide 2008-11-13
  • 打赏
  • 举报
回复
首先扫描字符串,将子串逐个记录下来;一遇有 '+' 号即把字符串值变为数字,并与累计值相加。

'+' 号的ascii码为43,



[Quote=引用 15 楼 pk167 的回复:]
引用 14 楼 BlueskyWide 的回复:
SQL code
--给楼主做出来了,自已定义了一个f_add_char()函数:

SQL> select * from t01;

SEQ NAME SALARY
---------- -------- ------------------------------
1 AAA 1000+1100+1200
1 BBB 2000
1 CCC 1100+2000
1 DDD 2000+2200+2400+2600

SQL>
SQL> CREATE OR REPLACE FUNCTION f_add_char(field…
[/Quote]
pk167 2008-11-13
  • 打赏
  • 举报
回复
谢谢大家的教导,结贴
pk167 2008-11-12
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 BlueskyWide 的回复:]
SQL code
--给楼主做出来了,自已定义了一个f_add_char()函数:

SQL> select * from t01;

SEQ NAME SALARY
---------- -------- ------------------------------
1 AAA 1000+1100+1200
1 BBB 2000
1 CCC 1100+2000
1 DDD 2000+2200+2400+2600

SQL>
SQL> CREATE OR REPLACE FUNCTION f_add_char(field_name IN varchar2) RETURN varchar2 …
[/Quote]

谢谢!!!问题已经解决!

但是还是想请教一下这一句怎么理解?
if ascii(substr(field_name,i,1))=43 or i=100 then
v_add_number := v_add_number + to_number(v_1);
v_1 :='';
else
v_1 := v_1 || substr(field_name,i,1);
end if

BlueskyWide 2008-11-12
  • 打赏
  • 举报
回复

--给楼主做出来了,自已定义了一个f_add_char()函数:

SQL> select * from t01;

SEQ NAME SALARY
---------- -------- ------------------------------
1 AAA 1000+1100+1200
1 BBB 2000
1 CCC 1100+2000
1 DDD 2000+2200+2400+2600

SQL>
SQL> CREATE OR REPLACE FUNCTION f_add_char(field_name IN varchar2) RETURN varchar2 IS
2 v_str_add varchar2(80) :='';
3 v_add_number number :=0;
4 v_1 varchar2(80) :='';
5 begin
6 For i in 1..100
7 Loop
8 if ascii(substr(field_name,i,1))=43 or i=100 then
9 v_add_number := v_add_number + to_number(v_1);
10 v_1 :='';
11 else
12 v_1 := v_1 || substr(field_name,i,1);
13 end if;
14 End loop;
15 v_str_add :=to_char(v_add_number);
16 return v_str_add;
17 end;
18 /

Function created

SQL> select seq,name,f_add_char(salary) from t01;

SEQ NAME F_ADD_CHAR(SALARY)
---------- -------- --------------------------------------------------------------------------------
1 AAA 3300
1 BBB 2000
1 CCC 3100
1 DDD 9200

SQL>





[Quote=引用楼主 pk167 的帖子:]
Table T01

SEQ NAME SALARY
-----------------------
1 AAA 1000+1100+1200
2 BBB 2000
3 CCC 1110+2000
4 DDD 2000+2200+2400+2600

我想要的结果是:

SEQ NAME SALARY
-----------------------
1 AAA 3300
2 BBB 2000
3 CCC 3110
4 DDD 9200

请问有办法吗?
[/Quote]
BlueskyWide 2008-11-12
  • 打赏
  • 举报
回复
1+2=3都知道,1+1=2如何证实?

请耐心点。
BlueskyWide 2008-11-12
  • 打赏
  • 举报
回复
可你的问题很复杂,知道吗?
正在调试,可能要到5点钟。


[Quote=引用 11 楼 pk167 的回复:]
引用 8 楼 hebo2005 的回复:
人家是新人新贴,除非是马甲


。。。我只是一个新人
[/Quote]
pk167 2008-11-12
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 hebo2005 的回复:]
人家是新人新贴,除非是马甲
[/Quote]

。。。我只是一个新人
pk167 2008-11-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 cosio 的回复:]
我那个错了,想的太简单了!
哈哈
贴一个实例给你看一下:

实现四则运算的一条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,'…
[/Quote]

谢谢,这个方法我需要时间学习一下!但是我想问一下,这个方法可以用在N条记录上的运算,还是要逐条逐条的公式?
pk167 2008-11-12
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wfqqwer5213 的回复:]
SQL code
create or replace function add_num(sql_add in varchar2) return number is
Result number;
begin
execute immediate 'select ' || sql_add || ' from dual' into Result;
return(Result);
end add_num;





SQL codeselect seq,name,add_num(salary) from T01;
[/Quote]

谢谢,wfqqwer5212这个我没看懂,不知道对这个问题有没有用?
hebo2005 2008-11-12
  • 打赏
  • 举报
回复
人家是新人新贴,除非是马甲
sleepzzzzz 2008-11-12
  • 打赏
  • 举报
回复
宁可0分贴回,揭贴率太低不要回!
cosio 2008-11-12
  • 打赏
  • 举报
回复
我那个错了,想的太简单了!
哈哈
贴一个实例给你看一下:

实现四则运算的一条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判断
wfqqwer5213 2008-11-12
  • 打赏
  • 举报
回复

create or replace function add_num(sql_add in varchar2) return number is
Result number;
begin
execute immediate 'select ' || sql_add || ' from dual' into Result;
return(Result);
end add_num;


select seq,name,add_num(salary) from T01;
cosio 2008-11-12
  • 打赏
  • 举报
回复
[Quote=引用楼主 pk167 的帖子:]
Table T01

SEQ NAME SALARY
-----------------------
1 AAA 1000+1100+1200
2 BBB 2000
3 CCC 1110+2000
4 DDD 2000+2200+2400+2600

我想要的结果是:

SEQ NAME SALARY
-----------------------
1 AAA 3300
2 BBB 2000
3 CCC 3110
4 DDD 9200

请问有办法吗?
[/Quote]
select seq,name,to_number(salary) from T01;
pk167 2008-11-12
  • 打赏
  • 举报
回复
你是指“结帖率:0.00%”吗?
一个人都没回复怎么结贴呢?
pk167 2008-11-12
  • 打赏
  • 举报
回复
????
gdqsh 2008-11-12
  • 打赏
  • 举报
回复
信誉

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧