プログラミング逆引き辞典

~ 多言語対応のプログラミングレシピ ~

MySQL ELT関数とFIELD関数

MySQLでバルクアップデートを実行する際に使用するELT関数とFIELD関数について解説する
 
 
・全レコードをバルクアップデート「ELT関数」を使用
・一部のレコードのみをバルクアップデート「ELT関数」と「FIELD関数」を組み合わせる
 

■ELT関数

ELT(n, str1, str2, str3, …)
ELT関数は文字列リストのn番目の要素を返す
要素が無い場合はNullを返す
 

select elt(1, '両津', '中川', '麗子'); -- 「両津」を返す
select elt(3, '両津', '中川', '麗子'); -- 「麗子」を返す
select elt(5, '両津', '中川', '麗子'); -- 「Null」を返す

 
またELT関数はレコード数の分、値を返す
 

--3レコードのtestテーブルを作成
create table test (id int, name varchar(20));
insert into test values (1, 'hoge'), (2, 'fuga'), (3, 'mumu');

select elt(1, '両津', '中川', '麗子') from test; -- 1番目の文字列リスト「両津」を3レコード返す

 
この特性を利用すると下記のようなUPDATE文を実行できる

select * from test;
---------------
| id   | name |
---------------
|    1 | hoge |
|    2 | fuga |
|    3 | mumu |
---------------

--ELT関数で全レコードをバルクアップデート
update test set name =  elt(id, '両津', '中川', '麗子');

select * from test;
---------------
| id   | name |
---------------
|    1 | 両津 |
|    2 | 中川 |
|    3 | 麗子 |
---------------

 
 


■FIELD関数

FIELD(str,str1,str2,str3,…)
FIELD関数はstr1、str2、str3、… リスト内で str のインデックス (位置) を返す
要素が無い場合は0を返す
 

select field('両津', '両津', '中川', '麗子'); -- 「1」を返す
select field('麗子', '両津', '中川', '麗子'); -- 「3」を返す
select field('大原', '両津', '中川', '麗子'); -- 「0」を返す

 
またELT関数同様、FIELD関数もレコード数の分、値を返す
 

select field('両津', '両津', '中川', '麗子') from test; -- 「両津」の文字列リストのインデックスを3レコード返す

 
 


■ELT関数とFEILD関数を組み合わせたバルクアップデート

前述のELT関数だけでもバルクアップデートは可能である
FEILD関数を組み合わせるメリットは特定のレコードをバルクアップデートを可能にするところにある
 
testテーブルのid:1と3をバルクアップデートしたい場合は下記のようにすればよい

select * from test;
---------------
| id   | name |
---------------
|    1 | 両津 |
|    2 | 中川 |
|    3 | 麗子 |
---------------

update test set name = elt(field(id, 1, 3), '勘吉', '秋本') where id in (1, 3);

select * from test;
---------------
| id   | name |
---------------
|    1 | 勘吉 |
|    2 | 中川 |
|    3 | 秋本 |
---------------

 

このSQLは下記の動きとなる

・最初に「where id = 1」を処理
field(1, 1, 3) ⇒ 1
elt(1, ‘勘吉’, ‘秋本’) ⇒ 勘吉
 
つまり「update test set name = ‘勘吉’ where id = 1;」を実行している
 
・次に「where id = 3」を処理
field(3, 1, 3) ⇒ 2
elt(2, ‘勘吉’, ‘秋本’) ⇒ 秋本
 
つまり「update test set name = ‘秋本’ where id = 3;」を実行している