2013-01-07 21 views
0

由於多個遺留系統,我正在處理的項目有一個由10列組成的表。MySQL字符串操作和數據重排

這些10列中,兩個數據將總是出現在兩個最後五列,通過標識字符串preceeded。

最後5列是pair0pair1pair2pair3,並且pair4

我正在尋找在二那些五列的是tx-speed=3D...rx-speed=3D...數據的格式。在每個字符串之後是一系列任意長度的數字。

我不能修改數據插入到該表中的程序,我只能修改它之後。

在每一行,現在和將來,我希望確保該系列的數字下面tx-speed=3D是在pair1列,該系列是繼rx-speed=3D數字是在pair2列。這兩列的內容並不重要,只要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 

回答

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'客戶端應用程序中處理數據而留下的,因此您可能也會用你喜歡的語言來做。