0

複数のレガシー システムがあるため、私が取り組んでいるプロジェクトには 10 列で構成されるテーブルがあります。

これらの 10 列のうち、最後の 5 列のうちの 2 列には常に、識別文字列が前に付いた 2 つのデータが表示されます。

最後のpair05列pair1pair2、、、、、pair3pair4

これら 5 つの列のうち 2 つの列で探しているデータの形式はtx-speed=3D...rx-speed=3D...です。これらの各文字列の後には、任意の長さの一連の数字が続きます。

このテーブルにデータを挿入するプログラムを変更することはできません。後で変更することしかできません。

tx-speed=3D既存および将来のすべての行で、次の一連の数字がpair1列にあり、次の一連の数字rx-speed=3Dが列にあることを確認したいと思いpair2ます。tx-speedとのrx-speed値が互いに上書きしない限り、これら 2 つの列の内容を保持することは重要ではありません。

プロジェクトの残念な制約として、これはデータベース トリガーでは実行できず、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 に答える