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の前に記述した列数と同じにする。