MySQL字符串操作和数据重新排列
由于有多个遗留系统,我正在处理的项目有一个由10列组成的表 在这10列中,最后五列中的两列将始终显示两条数据,前面是一个标识字符串 最后5列是MySQL字符串操作和数据重新排列,mysql,sql,Mysql,Sql,由于有多个遗留系统,我正在处理的项目有一个由10列组成的表 在这10列中,最后五列中的两列将始终显示两条数据,前面是一个标识字符串 最后5列是pair0,pair1,pair2,pair3和pair4 我在这五列中的两列中查找的数据格式是tx speed=3D…和rx speed=3D…。每个字符串后面都有一系列任意长度的数字 我无法修改将数据插入此表的程序,只能在以后进行修改 在现有和未来的每一行中,我希望确保tx speed=3D后面的数字序列位于pair1列中,并且rx speed=3D后
pair0
,pair1
,pair2
,pair3
和pair4
我在这五列中的两列中查找的数据格式是tx speed=3D…
和rx speed=3D…
。每个字符串后面都有一系列任意长度的数字
我无法修改将数据插入此表的程序,只能在以后进行修改
在现有和未来的每一行中,我希望确保tx speed=3D
后面的数字序列位于pair1
列中,并且rx speed=3D
后面的数字序列位于pair2
列中。只要tx speed
和rx speed
值不相互覆盖,这两列的内容就不需要保留
作为项目的一个不幸约束,这不能在数据库触发器上完成,它必须作为cron作业或类似作业的一部分
我最大的问题是我不是SQL管理员。我可以用许多可用语言中的一种编写脚本,但效率将是关键,从SQL中提取数据以检查数据并从其他平台重新插入数据将是非常低效的
我开始尝试编写一个SQL脚本来实现这一点,但我对SQL的工作原理了解得还不够,甚至无法让它工作
为了(希望)澄清一点,我将以下伪代码放在一起,希望有人能够利用这些伪代码进行SQL查询,我可以将其用于我的目的
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作业将只是“callcurdemo()”部分。您的表需要某种rowid 如果这不起作用,那么将数据取出并在不同的平台上进行检查就是你剩下的,因为你将在“mysql”客户端应用程序中处理数据。。。所以你最好用一种你熟悉的语言来做
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 //