由于有多个遗留系统,我正在处理的项目有一个由10列组成的表。
在这10列中,两条数据总是出现在最后五列中的两列中,前面是一个识别字符串。
最后5列为pair0
,pair1
,pair2
,pair3
和pair4
我在这五列中的两列中寻找的数据格式为tx-speed=3D...
和rx-speed=3D...
。每个字符串后面都是一系列任意长度的数字。
我无法修改将数据插入此表的程序,我只能在之后修改它。
在现有和未来的每一行中,我想确保tx-speed=3D
后面的一系列数字位于pair1
列中,并且rx-speed=3D
后面的一系列数字位于pair2
列。tx-speed
。只要rx-speed
和for each row:
@tx = ""
@rx = ""
txstr = "tx-speed=3D"
rxstr = "rx-speed=3D"
if (pair0 LIKE txstr+"%")
@tx = SUBSTRING(pair0, FROM txstr.count-1)
elsif (pair1 LIKE txstr+"%")
@tx = SUBSTRING(pair0, FROM txstr.count-1)
elsif (pair2 LIKE txstr+"%")
...
endif
if (pair0 LIKE rxstr+"%")
@rx = SUBSTRING(pair0, FROM rxstr.count-1)
elsif (pair1 LIKE rxstr+"%")
...
endif
pair1 = @tx
pair2 = @rx
值不会相互覆盖,这两列的内容就不重要了。
作为项目的一个不幸的约束,这不能在数据库触发器上完成,它必须作为cron作业或类似工作的一部分。
我的大问题是我不是SQL管理员。我可以使用许多可用语言中的一种编写脚本,但效率将是关键,将数据从SQL中拉出来检查它并从不同的平台重新插入它将是非常低效的。
我开始尝试编写一个SQL脚本来执行此操作,但我对SQL的工作原理几乎不了解甚至让它工作。
为了(希望)澄清一点,我把以下伪代码放在一起,希望有人能够用这个我可以用来实现我的目的的SQL查询。
{{1}}
答案 0 :(得分:0)
如果您能够创建存储过程(您说无法创建触发器):
delimiter //
drop procedure curdemo
//
create procedure curdemo()
begin
DECLARE done INT DEFAULT FALSE;
declare p0 char(20);
declare p1 char(20);
declare p2 char(20);
declare p3 char(20);
declare p4 char(20);
declare a mediumint;
declare cur1 cursor for select id,pair0,pair1,pair2,pair3,pair4 from test.t2;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
open cur1;
read_loop: loop
fetch cur1 into a,p0,p1,p2,p3,p4;
if done then
leave read_loop;
end if;
if p0 like 'tx-speed=3D%' then
update t2 set pair1 = substring_index(p0, 'tx-speed=3D', -1)
where id = a;
elseif p1 like 'tx-speed=3D%' then
update t2 set pair1 = substring_index(p1, 'tx-speed=3D', -1)
where id = a;
elseif p2 like 'tx-speed=3D%' then
update t2 set pair1 = substring_index(p2, 'tx-speed=3D', -1)
where id = a;
end if;
if p0 like 'rx-speed=3D%' then
update t2 set pair2 = substring_index(p0, 'rx-speed=3D', -1)
where id = a;
elseif p1 like 'rx-speed=3D%' then
update t2 set pair2 = substring_index(p1, 'rx-speed=3D', -1)
where id = a;
elseif p2 like 'rx-speed=3D%' then
update t2 set pair2 = substring_index(p2, 'rx-speed=3D', -1)
where id = a;
end if;
end loop;
close cur1;
end
//
drop table t2 //
create table t2 (
id mediumint not null auto_increment,
pair0 varchar(20),
pair1 varchar(20),
pair2 varchar(20),
pair3 varchar(20),
pair4 varchar(20),
primary key(id)
)
//
insert into t2 (pair0, pair1) values ('tx-speed=3D1230', 'rx-speed=3D1231') //
insert into t2 (pair0, pair2) values ('tx-speed=3D1232', 'rx-speed=3D1233') //
insert into t2 (pair4, pair3) values ('tx-speed=3D1233', 'rx-speed=3D1235') //
insert into t2 (pair2, pair3) values ('tx-speed=3D1236', 'rx-speed=3D1237') //
select * from t2 //
call curdemo()
//
select * from t2 //
你的cron工作就是“call curdemo()”部分。你的桌子需要某种rowid。
如果这不起作用,将数据拉出并在另一个平台上检查它就是你剩下的,因为你将在'mysql'客户端应用程序中处理数据......所以你不妨这样做它用你熟悉的语言。