0

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

在这 10 列中,两条数据将始终出现在最后五列中的两列中,前面有一个标识字符串。

最后 5 列是pair0, pair1, pair2, pair3, 和pair4

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

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

在每一行,现有的和未来的,我想确保后面的数字系列tx-speed=3Dpair1列中,并且后面的数字系列rx-speed=3Dpair2列中。这两列的内容并不重要,只要tx-speedrx-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
4

1 回答 1

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 工作将只是“调用 curdemo()”部分。您的表需要某种 rowid。

如果这不起作用,则将数据拉出并在不同的平台上检查它是你剩下的,因为你将在“mysql”客户端应用程序中处理数据......所以你不妨在您熟悉的语言。

于 2013-01-07T06:14:38.203 回答