提要:在本教程中,您将学习如何在 WHERE 子句中使用 IN 运算符来检查值列表。

PostgreSQL IN 语法

通过在 WHERE 里使用 IN 运算符,可以检查一个值是否存在于一个列表中。它的语法如下:

value IN (value1,value2,...)

如果值存在于列表中,这个表达式返回 true。列表中值的数量没有限制,所以可以像下面这样,使用另一个 SELECT 语句的结果集来填充列表:

value IN (SELECT value FROM tbl_name);

这个例子中,小括号里的语句称为子查询,它嵌套在另一个查询内部。

PostgreSQL IN 示例

假设,我们想从租赁表(rental)中找出 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;

customer_id in 1,2

可以通过组合 =OR 运算符来改写上面的例子:

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

可以通过组合 NOTIN 来查询值不在列表中的数据。下面的例子演示了从租赁表(rental)中找出 ID 不是 1 和 2 的客户:

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

customer_id not in 1,2

同样的,可以用 <>AND 的组合来改写上面的 NOT IN

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

PostgreSQL IN 中使用子查询

下面的例子演示了如何查询出 2005-05-27这天租过 DVD 的客户的 ID:

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

2005-05-27这天的租赁信息

下面,我们把些客户 ID 作为 IN 列表值,查询到这些客户的详细信息:

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

子查询

关于子查询的详细信息,可以通过我们的子查询教程进行学习。

上一篇:PostgreSQL的LIKE
下一篇:PostgreSQL的BETWEEN