MySQL の IN の記述

MySQL で WHERE 句に IN を指定するとき、以下のような挙動を起こします。

select * from table where id in (1,2,3);

この場合、(存在する限り、以下同様)id が 1, 2, 3 のレコードが取得されます。

select * from table where id in ("1","2","3");

この場合も id が 1, 2, 3 のレコードが取得されます。

select * from table where id in ("1,2,3");

この場合が問題で、先頭に指定された id が 1 のレコードだけが取得されてしまいます。


何らかのフレームワークSQL のラッパを利用するケースでは SQL のパースされる順序に気をつけないと問題が起こるかもしれません。Ruby on Rails 1.1.6 で試したところ、以下の形式では予期した動作をしてくれませんでした。

param = "1, 2, 3"
@items = Item.find(:all, :conditions => ["id IN (?)", param])

正しい動作を行わせたい場合、以下のように指定すれば問題ありません。

param = "1, 2, 3"
@items = Item.find(:all, :conditions => ["id IN (?)", param.split(',')])