質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

5回答

1374閲覧

レコードの2文字目をアルファベット(aから昇順)に置換するSQL文

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

1クリップ

投稿2016/08/04 01:43

###前提・実現したいこと
MySQLにて、データベースに入っているレコードに対し、
2文字目をアルファベット(aから昇順)に置換する
SQL文を作成したいです。

###実現したい動作イメージ
・SQL実行前
A00001
A00001
A00001

・SQL実行後
Aa0001
Ab0001
Ac0001

###現状

UPDATE table SET sampleID = concat(mid(sampleID,1,1),a,mid(sampleID,3,4))

これで2文字目に「a」を入れることはできるのですが、
「aから昇順で置換」の実装方法が全く分かりません。

宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ttyp03

2016/08/04 01:46

zまで使ったらそのあとはどうするのですか?
退会済みユーザー

退会済みユーザー

2016/08/04 01:50

ご回答ありがとうございます。 レコードが27以上存在する場合は、今回質問させていただいているSQL文の前処理でエラーとして吐き出す予定なので、今回は考慮していただかなくて問題ないです。 質問文から洩れていました、すみません。
guest

回答5

0

dupont_kedamaさん、A.Ichiさんの
ユーザ変数を使った方法ですが

MySQLのマニュアルと
OracleACEのAketiJyuuzouさんとyoku0825さんと
日本オラクルの木村明治さんによると
1ステートメントでユーザ変数を複数回使用した場合の
ユーザ変数の評価順序は未定義です。
http://qiita.com/AketiJyuuzou/items/cced9b70cc714b382d98

なので、連番にUpdateされることが保証されません。

結果が保証されないといえば、
OrderBy句がないと出力順が保証されないのは有名ですね。

投稿2016/08/10 03:17

tamako

総合スコア120

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

すごい無理やり感…。
参考程度でお願いします。

SQL

1SET @rownum=0; 2UPDATE `table` 3 SET sampleID=concat(mid(sampleID,1,1), 4 mid('abcdefghijklmnopqrstuvwxyz',(@rownum:=@rownum+1),1), 5 mid(sampleID,3,4));

投稿2016/08/04 02:19

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/08/04 02:42

ご回答ありがとうございます。実現できました! テーブルを増やすという発想が全くなく、またしても質問文から漏れていましたが、 今回はテーブルを増やせなかったので非常に助かりました。 また宜しくお願い致します。
guest

0

もしもtableに更新しうるユニークなKEY(sampleKEY)が有る場合です

SQL

1update table t1, 2 (select @i:=@i+1 as row, 3 concat(mid(sampleID,1,1),substr('abcdefghijklmnopqrstuvwxyz',@i,1),mid(sampleID,3,4)) as sampleID, 4 sampleKEY from (select @i:=0) as dum,table) t2 5 set t1.sampleID=t2.sampleID where t1.sampleKEY=t2.sampleKEY;

投稿2016/08/04 02:43

A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

無理やりやればこんな感じ?

準備

SQL

1create table tbl(id int not null primary key,data varchar(10)); 2insert into tbl values(1,'A00001'),(2,'A00001'),(3,'A00001');

#更新

SQL

1update tbl set data=concat(substr(data,1,1),char(@a:=if(@a is null,97,@a+1)),substr(data,3));

投稿2016/08/04 02:29

yambejp

総合スコア114779

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

単純なSQL文で「aから昇順」を作り出すことはできません。
よって別テーブル等でアルファベットとその順序を保持しておく必要があると思います。

こんな感じで実現できそうです。

SQL

1CREATE TABLE IF NOT EXISTS `alphabet` ( 2 `id` int(11) NOT NULL, 3 `val` varchar(1) NOT NULL 4) ENGINE=InnoDB DEFAULT CHARSET=utf8; 5 6INSERT INTO `alphabet` (`id`, `val`) VALUES 7(1, 'a'), 8(2, 'b'), 9(3, 'c'), 10(4, 'd'), 11(5, 'e'), 12(6, 'f')...以下略

SQL

1SET @a = 0; 2UPDATE 3 `table` 4SET 5 `sampleID` = SUBSTRING(CONCAT(@a:=@a+1,MID(`sampleID`,1,1),(SELECT MAX(`val`) FROM `alphabet` WHERE `id` = @a),MID(`sampleID`,3,4)),2);

投稿2016/08/04 02:20

dupont_kedama

総合スコア925

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問