SQLのIN句で複数の条件を指定する

SQLのIN句で複数の条件を指定する方法のメモ。

PostgreSQL 8.4 で確認。

適当なテーブルを作成

$ createdb in_test_db
$ psql in_test_db
in_test_db=> CREATE TABLE sample(id serial primary key, name text default '', age integer default 0);
NOTICE:  CREATE TABLEはシリアル列"sample.id"用に暗黙的なシーケンス"sample_id_seq"を作成します。
NOTICE:  CREATE TABLE / PRIMARY KEYはテーブル"sample"に暗黙的なインデックス"sample_pkey"を作成します
CREATE TABLE

テストデータ投入

in_test_db=> INSERT INTO sample (name, age) VALUES ('user_1', 20);
INSERT 0 1
in_test_db=> INSERT INTO sample (name, age) VALUES ('user_2', 20);
INSERT 0 1
in_test_db=> INSERT INTO sample (name, age) VALUES ('user_3', 30);
INSERT 0 1
in_test_db=> INSERT INTO sample (name, age) VALUES ('user_4', 24);
INSERT 0 1
in_test_db=> INSERT INTO sample (name, age) VALUES ('user_5', 29);
INSERT 0 1

データ確認

in_test_db=> SELECT * FROM sample;
 id |  name  | age
----+--------+-----
  1 | user_1 |  20
  2 | user_2 |  20
  3 | user_3 |  30
  4 | user_4 |  24
  5 | user_5 |  29


基本的なIN句

in_test_db=> SELECT * FROM sample WHERE age IN (24, 30);
 id |  name  | age
----+--------+-----
  3 | user_3 |  30
  4 | user_4 |  24

複数条件のIN句(条件の列数を合わせる、かっこで括る)

in_test_db=> SELECT * FROM sample 
                WHERE (name,age) IN ( ('user_2', 20), ('user_4', 24) );
 id |  name  | age
----+--------+-----
  2 | user_2 |  20
  4 | user_4 |  24


INの後にSELECT文の副問い合わせを記述する場合は、

in_test_db=> SELECT * FROM sample 
                WHERE (name,age) IN ( SELECT clm1, clm2 FROM sub_table..... );

のように副問い合わせで返ってくる列の数をINの前に記述した列数と同じにする。