早教吧作业答案频道 -->其他-->
为sql一字段值中每个特定字符前的最后一个数字加1怎么处理?如:sql中一个字段值为:1788987565327、768374872394903、21437238740213483874629、23412341234252345。其中顿号间隔的每一组数字位数和尾数不
题目详情
为sql一字段值中每个特定字符前的最后一个数字加1怎么处理?
如:sql中一个字段值为:1788987565327、768374872394903、21437238740213483874629、23412341234252345。其中顿号间隔的每一组数字位数和尾数不定,现在要使前面这个字段值中顿号前的数字尾数即7、3、9、5都分别加1,变成8、4、0、6输出成1788987565328、768374872394904、21437238740213483874620、23412341234252346。注意其中第三个数,从9加1后,输出成0,而不是10。多谢啦。
如:sql中一个字段值为:1788987565327、768374872394903、21437238740213483874629、23412341234252345。其中顿号间隔的每一组数字位数和尾数不定,现在要使前面这个字段值中顿号前的数字尾数即7、3、9、5都分别加1,变成8、4、0、6输出成1788987565328、768374872394904、21437238740213483874620、23412341234252346。注意其中第三个数,从9加1后,输出成0,而不是10。多谢啦。
▼优质解答
答案和解析
你这必须得采纳我的了,中午都没休息,帮你写了,你运行看看结果:
declare
targetstr varchar2(2000);
strlength number;
position number;
maxposition number;
retrunstr varchar2(2000);
tempstr varchar2(2000);
endstr number;
begin
targetstr := '1788987565327、768374872394903、21437238740213483874629、23412341234252345';
maxposition := 0;
select LENGTH(targetstr) into strlength from dual;
for i in 1..strlength loop
select instr(str,'、',1,i) into position from (select targetstr as str from dual);
--dbms_output.PUT_LINE(position);
if position > 0 then
if maxposition = 0 then
select substr(str,0,instr(str,'、',1,1)-1) into retrunstr from (select targetstr as str from dual);
select TO_NUMBER(substr(restr,-1)) into endstr from (select retrunstr as restr from dual);
if endstr = 3 or endstr = 5 or endstr = 7 then
endstr := endstr + 1;
elsif endstr = 9 then
endstr := 0;
end if;
select substr(str,0,instr(str,'、',1,1)-2)||TO_CHAR(endstr) into retrunstr from (select targetstr as str from dual);
elsif maxposition < position then
select substr(str,instr(str,'、',1,i-1)+1,instr(str,'、',1,i)-instr(str,'、',1,i-1)-1) into tempstr from (select targetstr as str from dual);
select TO_NUMBER(substr(restr,-1)) into endstr from (select tempstr as restr from dual);
if endstr = 3 or endstr = 5 or endstr = 7 then
endstr := endstr + 1;
elsif endstr = 9 then
endstr := 0;
end if;
select substr(str,1,length(str)-1) ||TO_CHAR(endstr) into tempstr from (select tempstr as str from dual);
retrunstr := retrunstr || '、'|| tempstr;
end if;
maxposition := position;
else
if maxposition > position then
--特别处理最后一段
tempstr := '';
select substr(str,maxposition-length(str)) into tempstr from (select targetstr as str from dual);
select TO_NUMBER(substr(restr,-1)) into endstr from (select tempstr as restr from dual);
if endstr = 3 or endstr = 5 or endstr = 7 then
endstr := endstr + 1;
elsif endstr = 9 then
endstr := 0;
end if;
select substr(str,1,length(str)-1) ||TO_CHAR(endstr) into tempstr from (select tempstr as str from dual);
retrunstr := retrunstr || '、'|| tempstr;
end if;
exit;
end if;
end loop;
dbms_output.PUT_LINE(retrunstr);
end;
运行结果如下:
14:03:38 **** SCRIPT STARTED: 02-Apr-2015 14:03:38 ****
14:03:38 declare
14:03:38 targetstr varchar2(2000);
14:03:38 ...
14:03:39 PL/SQL block executed
1788987565328、768374872394904、21437238740213483874620、23412341234252346
14:03:39 **** SCRIPT ENDED 02-Apr-2015 14:03:39 ****
14:03:39 End Script Execution
declare
targetstr varchar2(2000);
strlength number;
position number;
maxposition number;
retrunstr varchar2(2000);
tempstr varchar2(2000);
endstr number;
begin
targetstr := '1788987565327、768374872394903、21437238740213483874629、23412341234252345';
maxposition := 0;
select LENGTH(targetstr) into strlength from dual;
for i in 1..strlength loop
select instr(str,'、',1,i) into position from (select targetstr as str from dual);
--dbms_output.PUT_LINE(position);
if position > 0 then
if maxposition = 0 then
select substr(str,0,instr(str,'、',1,1)-1) into retrunstr from (select targetstr as str from dual);
select TO_NUMBER(substr(restr,-1)) into endstr from (select retrunstr as restr from dual);
if endstr = 3 or endstr = 5 or endstr = 7 then
endstr := endstr + 1;
elsif endstr = 9 then
endstr := 0;
end if;
select substr(str,0,instr(str,'、',1,1)-2)||TO_CHAR(endstr) into retrunstr from (select targetstr as str from dual);
elsif maxposition < position then
select substr(str,instr(str,'、',1,i-1)+1,instr(str,'、',1,i)-instr(str,'、',1,i-1)-1) into tempstr from (select targetstr as str from dual);
select TO_NUMBER(substr(restr,-1)) into endstr from (select tempstr as restr from dual);
if endstr = 3 or endstr = 5 or endstr = 7 then
endstr := endstr + 1;
elsif endstr = 9 then
endstr := 0;
end if;
select substr(str,1,length(str)-1) ||TO_CHAR(endstr) into tempstr from (select tempstr as str from dual);
retrunstr := retrunstr || '、'|| tempstr;
end if;
maxposition := position;
else
if maxposition > position then
--特别处理最后一段
tempstr := '';
select substr(str,maxposition-length(str)) into tempstr from (select targetstr as str from dual);
select TO_NUMBER(substr(restr,-1)) into endstr from (select tempstr as restr from dual);
if endstr = 3 or endstr = 5 or endstr = 7 then
endstr := endstr + 1;
elsif endstr = 9 then
endstr := 0;
end if;
select substr(str,1,length(str)-1) ||TO_CHAR(endstr) into tempstr from (select tempstr as str from dual);
retrunstr := retrunstr || '、'|| tempstr;
end if;
exit;
end if;
end loop;
dbms_output.PUT_LINE(retrunstr);
end;
运行结果如下:
14:03:38 **** SCRIPT STARTED: 02-Apr-2015 14:03:38 ****
14:03:38 declare
14:03:38 targetstr varchar2(2000);
14:03:38 ...
14:03:39 PL/SQL block executed
1788987565328、768374872394904、21437238740213483874620、23412341234252346
14:03:39 **** SCRIPT ENDED 02-Apr-2015 14:03:39 ****
14:03:39 End Script Execution
看了 为sql一字段值中每个特定字...的网友还看了以下:
2014圣诞节,一个有若干人的小组,若每人给每小组的其他成员赠送一张贺年卡,则全组送贺年卡共90张 2020-05-13 …
找出每一组的错误,并且更正第1组haspleythemsmall第2组ringsorrygolds 2020-05-14 …
一道关于足球的应用题(初一)题:按照世界杯足球赛的比赛规则,参赛的32支球队先分成8个小组.小组赛 2020-06-17 …
一道算法题n个小朋友在老师的带领下玩游戏.其中需要分组,老师打算根据大家的衣服颜色分组.已知衣服颜 2020-06-18 …
五年一班共有48人,分4组,每组12人,每小组的学生人数占全班人数的四分之一.判断 2020-07-22 …
对于频率分布直方图,下列叙述错误的是()A.所有小长方形面积的和等于1B.每小组的频数与样本容量的 2020-07-29 …
我校为了培养小能人、小发明家,开展了全校性的小制作比赛,作品上交时间为2010年3月1日至3月30日 2020-11-19 …
在频数分布直方图中,每个小长形的高度等于()A.组距B.组数C.每小组的频率D.每小组的频数 2020-12-23 …
每年一届的世界杯足球赛,共有32支球队分成8各小组进行小组赛,每小组的前2名进入16强,比赛规则是: 2020-12-25 …
男足世界杯分组抽签是每个组的四支球队都放好了再抽出来还是四档球队每档八只球队放在四个位置一组组抽? 2021-01-09 …