Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL字符串操作和数据重新排列_Mysql_Sql - Fatal编程技术网

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

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后

由于有多个遗留系统,我正在处理的项目有一个由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
值不相互覆盖,这两列的内容就不需要保留

作为项目的一个不幸约束,这不能在数据库触发器上完成,它必须作为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 //