MysqlでCase文を使ってUpdateしてみた | Pimp my Code. @wataru420

Pimp my Code. @wataru420

My name is Wataru Fukunaga.

テーマ:
こんなTableがありました。
createtable.sql #

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

こんな感じ。
update.sql #

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文の最初の条件には更新するカラムを指定しないとうまく機能しなかった。
なんでだろう。
AD