SQLスキルアップに役立つ!PostgreSQLのWHERE IN句で多様な検索を実現
PostgreSQLにおける複数列のWHERE IN句
構文:
SELECT * FROM table_name
WHERE (column1, column2) IN (
(value11, value12),
(value21, value22),
...
);
説明:
table_name
: 対象となるテーブル名column1, column2
: 比較対象の列名value11, value12, ...
: 比較する値。複数の値をカンマ区切りで記述します。()
: それぞれの値の組み合わせをカッコで囲みます。IN
: 値の比較演算子。=
と同じ意味です。
例:
社員テーブル employees
に、氏名と部署を表す name
と department
列があるとします。このテーブルから、営業部または人事部の社員をすべて抽出したい場合は、以下のクエリを実行します。
SELECT * FROM employees
WHERE (name, department) IN (
('田中 太郎', '営業部'),
('佐藤 花子', '人事部'),
('鈴木 健', '営業部')
);
このクエリは、name
列と department
列の値の組み合わせが、指定された3つの組み合わせのいずれかであるすべての行を抽出します。
複数列IN句の利点:
- 複数の条件を効率的に処理できる
- コードが簡潔になる
- 読みやすい
- すべての列にNULL値が含まれている場合は、一致する行として扱われません。
- 複数の列でインデックスが張られている場合は、パフォーマンスを向上させることができます。
- 上記の構文以外にも、サブクエリを使用して
WHERE IN
句を記述することができます。 ANY
句を使用して、複数の列のいずれかの値が一致する行を抽出することもできます。
-- employeesテーブルを作成
CREATE TABLE employees (
id SERIAL PRIMARY KEY,
name VARCHAR(50) NOT NULL,
department VARCHAR(50) NOT NULL
);
-- employeesテーブルにデータを追加
INSERT INTO employees (name, department) VALUES
('田中 太郎', '営業部'),
('佐藤 花子', '人事部'),
('鈴木 健', '営業部'),
('高橋 伊織', '開発部'),
('渡辺 美咲', '総務部');
営業部または人事部の社員をすべて抽出
SELECT * FROM employees
WHERE (name, department) IN (
('田中 太郎', '営業部'),
('佐藤 花子', '人事部'),
('鈴木 健', '営業部')
);
結果:
id | name | department |
---|---|---|
1 | 田中 太郎 | 営業部 |
2 | 佐藤 花子 | 人事部 |
3 | 鈴木 健 | 営業部 |
氏名に「田中」が含まれ、かつ部署が「営業部」または「人事部」である社員を抽出
SELECT * FROM employees
WHERE (name, department) IN (
('田中 太郎', '営業部'),
('田中 太郎', '人事部'),
('鈴木 健', '営業部')
);
このクエリは、name
列に「田中」が含まれ、かつ department
列の値が「営業部」または「人事部」である行をすべて抽出します。
id | name | department |
---|---|---|
1 | 田中 太郎 | 営業部 |
2 | 佐藤 花子 | 人事部 |
サブクエリを使用してWHERE IN句を記述
SELECT * FROM employees
WHERE (name, department) IN (
SELECT name, department FROM departments
WHERE name = '営業部' OR name = '人事部'
);
このクエリは、departments
テーブルから「営業部」または「人事部」のレコードをすべて取得し、その name
列と department
列の値を使用して、employees
テーブルから一致する行を抽出します。
id | name | department |
---|---|---|
1 | 田中 太郎 | 営業部 |
2 | 佐藤 花子 | 人事部 |
3 | 鈴木 健 | 営業部 |
ANY句を使用して、いずれかの列が一致する行を抽出
SELECT * FROM employees
WHERE name = '田中 太郎' OR department = '営業部';
このクエリは、name
列が「田中 太郎」である行、または department
列が「営業部」である行をすべて抽出します。
id | name | department |
---|---|---|
1 | 田中 太郎 | 営業部 |
3 | 鈴木 健 | 営業部 |
- 上記の例では、
employees
テーブルとdepartments
テーブルを使用していますが、これはあくまでも例です。実際のコードでは、使用するテーブル名や列名に置き換えてください。 - WHERE句以外にも、SELECT句、FROM句、ORDER BY句などの句を組み合わせて使用することができます。
行値式を使用して、複数の列の値を1つの式として記述することができます。
SELECT * FROM employees
WHERE (name, department) = ('田中 太郎', '営業部');
CASE式を使用する
CASE式を使用して、複数の条件を処理することもできます。
SELECT * FROM employees
WHERE
CASE
WHEN name = '田中 太郎' AND department = '営業部' THEN TRUE
WHEN name = '佐藤 花子' AND department = '人事部' THEN TRUE
ELSE FALSE
END;
このクエリは、name
列が「田中 太郎」で、かつ department
列の値が「営業部」である行、または name
列が「佐藤 花子」で、かつ department
列の値が「人事部」である行を抽出します。
EXISTS句を使用する
EXISTS句を使用して、サブクエリで条件を処理することもできます。
SELECT * FROM employees
WHERE EXISTS (
SELECT 1 FROM departments
WHERE departments.name = employees.department AND departments.name IN ('営業部', '人事部')
);
このクエリは、employees
テーブルの department
列の値が、departments
テーブルの name
列の値と一致し、かつ departments
テーブルの name
列の値が「営業部」または「人事部」である行をすべて抽出します。
JOIN句を使用する
JOIN句を使用して、複数のテーブルを結合し、条件を処理することもできます。
SELECT e.id, e.name, e.department
FROM employees AS e
JOIN departments AS d ON e.department = d.name
WHERE d.name IN ('営業部', '人事部');
- 上記の方法は、それぞれ異なる利点と欠点があります。状況に応じて適切な方法を選択してください。
- 複雑なクエリを作成する場合は、複数の方法を組み合わせることもできます。
- どの方法を使用するにしても、クエリのパフォーマンスを考慮することが重要です。必要に応じて、インデックスを作成したり、クエリを最適化したりしてください。
sql postgresql