💭
【MySQL】まとめてupdate処理したい
わりと結構な回数、同じようなupdate処理をしないといけなくなりました。
最初、ループで何度もupdate処理をさせる、というのを想像したのですが
もっとかっこよいupdate方法ないかな?
と思っていろいろ調べたらありましたので紹介します。
環境
- MySQL 5.6
UPDATE処理
UPDATE {テーブル名} SET columnA = ELT(FIELD(columnB, 1, 2, 3, ...), A, B, C, ...) WHERE columnB IN (1, 2, 3, ...);
※この方法、EC-CUBEで実現させるためには、updateメソッドではなくSQL文をいちから作るしかないです
見慣れない関数だったので以下、リファレンス貼ります
ELT()
ELT() は、文字列リストの N 番目の要素を返します。
N = 1 の場合は str1、N = 2 の場合は str2 のように返します。
N が 1 よりも小さいか、引数の数よりも大きい場合は、NULL を返します。
ELT() は FIELD() の補数です。
mysql> SELECT ELT(1, 'ej', 'Heja', 'hej', 'foo');
-> 'ej'
mysql> SELECT ELT(4, 'ej', 'Heja', 'hej', 'foo');
-> 'foo'
FIELD()
str1、str2、str3、... リスト内で str のインデックス (位置) を返します。str が見つからない場合は、0 を返します。
FIELD() へのすべての引数が文字列の場合は、すべての引数が文字列として比較されます。すべての引数が数値の場合は、数字として比較されます。それ以外の場合は、引数が倍精度として比較されます。
NULL ではどの値との等価比較にも失敗するため、str が NULL である場合は、戻り値が 0 になります。FIELD() は ELT() の補数です。
mysql> SELECT FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo');
-> 2
mysql> SELECT FIELD('fo', 'Hej', 'ej', 'Heja', 'hej', 'foo');
-> 0
Discussion