PostgreSQL IN 运算符用法与实例

本文介绍了在 PostgreSQL 中如何使用 IN 运算符检查一个值列表是否包含一个指定的值。

在 PostgreSQL 中,IN 运算符是一个布尔运算符,用来检查一个值列表是否包含一个指定的值。如果值列表包含了指定的值,则 IN 运算符返回真,否则它返回假。

PostgreSQL IN 运算符语法

要检查一个值是否位于一个值列表之内,请按照以下语法使用 IN 运算符:

expr IN (value1, value2, ...)

或者

expr IN (subquery)

这里:

  • expr 可以是一个字段名、值或其他的表达式(比如函数调用、运算等)。
  • (value1, value2, ...) 是一个值列表,多个值之间使用 , 分隔,并使用小括号 () 将它们包围起来。
  • value1 是具体的值,ke 比如:1, 2, 'A', 'B' 等。
  • subquery 是一个只返回一个列的子查询

如果值列表或者子查询返回的值中包含了 exprIN 运算符返回真,否则它返回假。

IN 运算符的否定操作是 NOT IN

IN vs OR

IN 表达式都可以使用 OR 运算符改写。

比如:

val IN (1, 2, 3)

等同于如下使用 OR 的表达式:

val = 1 OR val = 2 OR val = 3

同理,NOT IN 表达式都可以使用 AND 运算符改写。

val NOT IN (1, 2, 3)

等同于如下使用 AND 的表达式:

val <> 1 AND val <> 2 OR val <> 3

PostgreSQL IN 运算符实例

我们将使用 Sakila 示例数据库 中的表进行演示,请您先在 PostgreSQL 中安装 Sakila 示例数据库

在 Sakila 示例数据库中, actor存储了所有的演员的信息。

要从 actor 表中查询姓氏为 ALLENDAVIS 的所有演员,请使用以下带有 IN 运算符的语句:

SELECT *
FROM actor
WHERE last_name IN ('ALLEN', 'DAVIS');
 actor_id | first_name | last_name |     last_update
----------+------------+-----------+---------------------
        4 | JENNIFER   | DAVIS     | 2006-02-15 04:34:33
      101 | SUSAN      | DAVIS     | 2006-02-15 04:34:33
      110 | SUSAN      | DAVIS     | 2006-02-15 04:34:33
      118 | CUBA       | ALLEN     | 2006-02-15 04:34:33
      145 | KIM        | ALLEN     | 2006-02-15 04:34:33
      194 | MERYL      | ALLEN     | 2006-02-15 04:34:33
(6 rows)

您可以使用 OR 运算符改写上面的语句:

SELECT *
FROM actor
WHERE last_name = 'ALLEN'
  OR last_name = 'DAVIS';

在 PostgreSQL IN 中使用子查询

要从 film 表中检索拥有库存的影片的数量,您可以使用带有子查询的 PostgreSQL IN 的表达式:

SELECT COUNT(*)
FROM film
WHERE film_id IN (
    SELECT film_id
    FROM inventory
  );
 count
-------
   958

通常,带有子查询的 PostgreSQL IN 的表达式都可以使用 EXISTS 运算符 改写,并且 EXISTS 表达式具有更好的效率。上面的语句等同于以下使用 EXISTS 的语句:

SELECT COUNT(*)
FROM film f
WHERE EXISTS (
    SELECT 1
    FROM inventory i
    WHERE i.film_id = f.film_id
  );
 count
-------
   958

结论

PostgreSQL IN 运算符是一个布尔运算符,用来检查一个值列表是否包含一个指定的值。如果值列表包含了指定的值,则 IN 运算符返回真,否则它返回假。