こんなTableがありました。
| CREATE TABLE `hoge` ( `user_id` char(32) NOT NULL default '', `category_1` smallint(5) unsigned default NULL, `category_2` smallint(5) unsigned default NULL, PRIMARY KEY (`user_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8
|
そして、ここからカテゴリーがひとつ減るから、違うカテゴリーに移行するって話になりました。
簡単なスクリプト書いて、For文とかでぐるぐる回せば簡単にできるけど、結構データが多いから、SQLの発行回数を抑えたいなと思ったのです。
でもこのTable、カテゴリーが2種類登録できて、ちょっと複雑なので、条件分岐が必要。
そこでCase文を使ってゴニョゴニョやってみました。
MysqlのCase文の説明
http://dev.mysql.com/doc/refman/5.1/ja/case-statement.html
こんな感じ。
| SET @old_category = 706; SET @new_category = 704;
update hoge set category_2 = ( CASE WHEN category_2 = @old_category AND category_1 = @new_category THEN null WHEN category_2 = @new_category AND category_1 = @old_category THEN null WHEN category_2 = @old_category THEN @new_category ELSE category_2 END), category_1 = ( CASE WHEN category_1 = @old_category THEN @new_category ELSE category_1 END) where category_1 = @old_category or category_2 = @old_category;
|
Case文はひとつのカラムの更新毎に書いていきます。
これはCase文が「文」ではなく「式」だから、Case文の中にさらに文を書くことはできない。
また、Mysql4で試した限り、Case文の最初の条件には更新するカラムを指定しないとうまく機能しなかった。
なんでだろう。