SQLite | データの検索 | 値の一覧と比較する(IN句)
IN句を使うと、カラム値が一覧内のいずれかと一致するか判定できます。ここでは、その使い方を説明します。
条件付き検索についてはWHERE句の記事を参照してください。
IN句を使った条件式
INに値の一覧を指定して一致を判定します。構文は次のとおりです。
SELECT カラム名, ... FROM テーブル名 WHERE カラム IN (値1, 値2, ...);
カラム値が一覧のいずれかと一致すると行を取得します。これは等価比較をORで結ぶ場合と同じです。
SELECT カラム名, ... FROM テーブル名 WHERE カラム = 値1 OR カラム = 値2 OR ...;
NOT INを使うと一覧に含まれない行を取得できます。
SELECT カラム名, ... FROM テーブル名 WHERE カラム NOT IN (値1, 値2, ...);
–
例として次のテーブルを作成します。
create table user (name text, old integer, address text);
sqlite> create table user (name text, old integer, address text);
sqlite>
テーブルにデータを追加します。
insert into user values ('devkuma', 39, 'Seoul');
insert into user values ('kimkc', 34, 'Busan');
insert into user values ('araikuma', 26, 'Paju');
insert into user values ('happykuma', 19, 'Paju');
insert into user values ('mykuma', 27, 'Daejeon');
insert into user values ('yourkuma', 28, 'Seongnam');
insert into user values ('raccoon', 31, 'Suwon');
sqlite> insert into user values ('devkuma', 39, 'Seoul');
sqlite> insert into user values ('kimkc', 34, 'Busan');
sqlite> insert into user values ('araikuma', 26, 'Paju');
sqlite> insert into user values ('happykuma', 19, 'Paju');
sqlite> insert into user values ('mykuma', 27, 'Daejeon');
sqlite> insert into user values ('yourkuma', 28, 'Seongnam');
sqlite> insert into user values ('raccoon', 31, 'Suwon');
sqlite>
条件なしで検索すると次の結果になります。
select * from user;
sqlite> select * from user;
name old address
---------- ---------- ----------
devkuma 39 Seoul
kimkc 34 Busan
araikuma 26 Paju
happykuma 19 Paju
mykuma 27 Daejeon
yourkuma 28 Seongnam
raccoon 31 Suwon
sqlite>
addressがPaju、Seongnam、Suwonのいずれかに一致する行を検索します。
select * from user where address in ('Paju', 'Seongnam', 'Suwon');
sqlite> select * from user where address in ('Paju', 'Seongnam', 'Suwon');
name old address
---------- ---------- ----------
araikuma 26 Paju
happykuma 19 Paju
yourkuma 28 Seongnam
raccoon 31 Suwon
sqlite>
条件に一致する行だけが返されます。
別のテーブルから取得した値と比較する
値を直接列挙する代わりに、サブクエリで別テーブルから一覧を取得できます。構文は次のとおりです。
SELECT カラム名, ... FROM テーブル名 WHERE カラム IN (SELECT カラム名 FROM テーブル名);
サブクエリは1カラムだけを返す必要があります。その結果のいずれかと一致する行を取得します。
次のテーブルを作成します。
create table gyeonggi (id integer, region text);
sqlite> create table gyeonggi (id integer, region text);
sqlite>
テーブルにデータを追加します。
insert into gyeonggi values (1, 'Paju');
insert into gyeonggi values (2, 'Seongnam');
insert into gyeonggi values (3, 'Suwon');
insert into gyeonggi values (4, 'Gimpo');
sqlite> insert into gyeonggi values (1, 'Paju');
sqlite> insert into gyeonggi values (2, 'Seongnam');
sqlite> insert into gyeonggi values (3, 'Suwon');
sqlite> insert into gyeonggi values (4, 'Gimpo');
sqlite>
addressがgyeonggiテーブルのregionと一致するuser行を検索します。
select * from user where address in (select region from gyeonggi);
sqlite> select * from user where address in (select region from gyeonggi);
name old address
---------- ---------- ----------
araikuma 26 Paju
happykuma 19 Paju
yourkuma 28 Seongnam
raccoon 31 Suwon
sqlite>
条件に一致する行だけが返されます。