Using ‘IN’ and ‘NOT IN’ in PostgreSQL

Updated: January 4, 2024 By: Guest Contributor Post a comment

Introduction

Understanding the use of ‘IN’ and ‘NOT IN’ clauses in PostgreSQL is fundamental for querying data with complex criteria efficiently. This tutorial explores these conditionals in detail with practical examples.

Basic Usage of IN

The ‘IN’ operator in PostgreSQL allows us to specify multiple values in a WHERE clause. It is a shorthand for multiple OR conditions.

SELECT * FROM customers WHERE city IN ('New York', 'Chicago', 'Los Angeles');

Subqueries with IN

Subqueries can be used with IN to match results from another table:

SELECT * FROM products WHERE id IN (SELECT product_id FROM order_details WHERE quantity > 10);

Working with NULLs using IN

Be cautious when NULL values are involved in IN conditions as they can yield unexpected results.

SELECT * FROM employees WHERE department_id IN (SELECT id FROM departments WHERE budget IS NULL);

Using NOT IN

To exclude values, we use NOT IN:

SELECT * FROM customers WHERE city NOT IN ('New York', 'Chicago');

Performance Implications

Large lists in IN clauses can lead to performance issues. Use with care, particularly if the values come from subqueries.

Junction Tables and IN

For many-to-many relationships, using IN with junction tables is a common pattern:

SELECT products.* FROM products JOIN product_categories ON products.id = product_categories.product_id WHERE product_categories.category_id IN (2, 3, 5);

Advanced Subquery Optimization

When using subqueries with IN, they should be optimized to return only necessary columns for efficiency. Also consider using EXISTS as an alternative:

SELECT * FROM employees WHERE EXISTS (SELECT 1 FROM departments WHERE departments.id = employees.department_id AND budget > 100000);

Combining IN with other Conditions

IN clauses can be combined with LIKE, BETWEEN, and other conditional expressions for more complex filters:

SELECT * FROM customers WHERE (city IN ('New York', 'San Francisco')) AND (created_at BETWEEN '2021-01-01' AND '2021-12-31');

Array Functions and IN

PostgreSQL also supports the use of arrays with the IN operator. Instead of a set of literals, you can use an array as a comparison list.

SELECT * FROM students WHERE student_id = ANY('{1,2,3,4}'::int[]);

Conclusion

‘IN’ and ‘NOT IN’ are powerful tools in PostgreSQL for filtering datasets. Use them wisely to tidy up your queries, but ensure to assess performance implications and alternative constructs like EXISTS when facing complex database queries.