PostgreSQL 教程: IN

九月 5, 2023

摘要:在本教程中,您将学习如何在WHERE子句中使用 PostgreSQL 的 IN 运算符,来检查某个值是否与列表中的任何值匹配。

PostgreSQL IN 运算符语法

您可以在WHERE子句中使用IN运算符来检查某个值是否与值列表中的任何值匹配。

IN运算符的语法如下:

value IN (value1,value2,...)

如果value匹配列表中的任何值,即value1, value2, … ,则IN运算符返回 true。

值列表可以是文字值(如数字、字符串)列表,或者SELECT语句的结果,如下:

value IN (SELECT column_name FROM table_name);

括号内的查询称为子查询,它是嵌套在另一个查询中的查询。请注意,您将在后续教程中了解有关子查询的更多信息。

PostgreSQL IN 运算符示例

假设你想知道 ID 为 1 和 2 的客户的租赁信息,你可以在WHERE子句中使用IN运算符,如下所示:

SELECT customer_id,
	rental_id,
	return_date
FROM
	rental
WHERE
	customer_id IN (1, 2)
ORDER BY
	return_date DESC;

PostgreSQL IN example

以下查询使用等于 (=) 和OR运算符替代 IN 运算符。它等价于上面的查询:

SELECT
	rental_id,
	customer_id,
	return_date
FROM
	rental
WHERE
	customer_id = 1 OR customer_id = 2
ORDER BY
	return_date DESC;

使用IN运算符的查询比使用等于 (=) 和OR运算符的查询更短且更具可读性。此外,PostgreSQL 使用IN运算符执行查询比使用OR运算符列表执行相同查询要快得多。

PostgreSQL NOT IN 运算符

您可以将IN运算符与NOT运算符结合使用来选择其值与列表中的值不匹配的行。

例如,以下语句查找 ID 不为 1 或 2 的客户的所有租赁。

SELECT
	customer_id,
	rental_id,
	return_date
FROM
	rental
WHERE
	customer_id NOT IN (1, 2);

PostgreSQL NOT IN example

IN运算符类似,您可以使用不等于 (<>) 和AND运算符来编写NOT IN运算符:

SELECT
	customer_id,
	rental_id,
	return_date
FROM
	rental
WHERE
	customer_id <> 1
AND customer_id <> 2;

此查询返回与上面使用NOT IN运算符的查询相同的输出。

带有子查询的 IN 表达式

以下语句从rental表中查询返回日期为2005-05-27的客户 ID 列表:

SELECT customer_id
FROM rental
WHERE CAST (return_date AS DATE) = '2005-05-27'
ORDER BY customer_id;

PostgreSQL IN - ID List

由于此查询返回一个值列表,因此您可以将其用作IN运算符的输入,如下所示:

SELECT
	customer_id,
	first_name,
	last_name
FROM
	customer
WHERE
	customer_id IN (
		SELECT customer_id
		FROM rental
		WHERE CAST (return_date AS DATE) = '2005-05-27'
	)
ORDER BY customer_id;

PostgreSQL IN with a subquery

有关子查询的更多信息,请查看子查询教程

在本教程中,您学习了如何使用 PostgreSQL 的IN运算符,来检查值是否与值列表中的任何值匹配。