###前提
MySQLにて、データベースに入っているレコードに対し、
2文字目をアルファベット(aから昇順)に置換する
SQL文を作成しています。
###現状の動作と実現したい動作イメージ
・SQL実行前
ID / 枝番/ ユーザID
A001 / 001 / E001
A001 / 002 / E002
: / : / :
A001 / 026 / E026
A002 / 001 / F001
A002 / 002 / F002
A003 / 001 / F002
・SQL実行後(現状)
ID / 枝番/ ユーザID
Aa01 / 001 / E001
Ab01 / 002 / E002
: / : / :
Az01 / 026 / E026
A02 / 001 / F001
A02 / 002 / F002
A03 / 001 / F002
※上から順にaからzを振られているが、
27番目以降は2文字目にnullが置換されている
・SQL実行後(理想)
ID / 枝番/ ユーザID
Aa01 / 001 / E001
Ab01 / 002 / E002
: / : / :
Az01 / 026 / E026
Aa02 / 001 / F001
Ab02 / 002 / F002
Aa03 / 001 / F002
※ユーザIDとID、セットでPK扱い。
27番目以降でもユーザIDとIDのセットが新しくなっていれば、
2文字目を「a」から開始する。
※ユーザIDとIDのセットが27以上存在する場合は
別箇所でエラー処理する予定なので今回は考慮していただかなくて大丈夫です。
###現在試していること
ストアドプロシージャで、
IDとユーザIDでgroup byし、その結果をカーソル変数に代入、
ループしながら2文字目を書き換える、というSQL文で
実現しようとしています。
###現在作成しているSQL文
SQL
1delimiter // 2create procedure alphabet() 3 4BEGIN 5 DECLARE done INT DEFAULT 0; 6 DECLARE _count INT; 7 DECLARE cur CURSOR FOR #カーソル変数 8 SELECT 9 count(*) 10 FROM 11 sampleTable 12 GROUP BY ID,USER_ID 13 ORDER BY branch ASC; # branch:枝番 14 DECLARE EXIT HANDLER FOR NOT FOUND SET done = 1; 15 16 OPEN cur; 17 WHILE done !=1 DO 18 FETCH cur INTO _count; 19 IF _count > 1 AND _count < 27 THEN 20 SET @i:=0; 21 UPDATE 22 sampleTable AS tbl3, 23 (SELECT 24 MID('abcdefghijklmnopqrstuvwxyz',@i:= @i+1,1) AS ID, 25 USER_ID 26 FROM 27 (SELECT @i:= 0) AS dum, 28 29 (SELECT DISTINCT 30 USER_ID 31 FROM 32 sampleTable ORDER BY 1 33 ) AS tbl2 34 ) AS tbl1 35 SET 36 tbl3.ID = concat(MID(tbl3.ID,1,1),tbl1.ID,MID(tbl3.ID,3,2)) 37 WHERE 38 tbl3.USER_ID = tbl1.USER_ID; 39 40 ELSE UPDATE sampleTable SET ID = ID; 41 END IF; 42 END WHILE; 43 CLOSE cur; 44END 45// 46 47CALL alphabet()
###追記
現在、ストアドプロシージャで実現しようとしていますが、
他の方法があれば、特にストアドプロシージャにはこだわりません。
以上です。
複雑で申し訳ないですが、
ご不明点等ございましたらご指摘ください。
宜しくお願い致します。
回答5件
あなたの回答
tips
プレビュー