MySQL字符串操作和数据重新排列

时间:2013-01-07 03:35:48

标签: mysql sql

由于有多个遗留系统,我正在处理的项目有一个由10列组成的表。

在这10列中,两条数据总是出现在最后五列中的两列中,前面是一个识别字符串。

最后5列为pair0pair1pair2pair3pair4

我在这五列中的两列中寻找的数据格式为tx-speed=3D...rx-speed=3D...。每个字符串后面都是一系列任意长度的数字。

我无法修改将数据插入此表的程序,我只能在之后修改它。

在现有和未来的每一行中,我想确保tx-speed=3D后面的一系列数字位于pair1列中,并且rx-speed=3D后面的一系列数字位于pair2列。tx-speed。只要rx-speedfor 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}}

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'客户端应用程序中处理数据......所以你不妨这样做它用你熟悉的语言。