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是一个只返回一个列的子查询。
如果值列表或者子查询返回的值中包含了 expr,IN 运算符返回真,否则它返回假。
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 表中查询姓氏为 ALLEN 或 DAVIS 的所有演员,请使用以下带有 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 运算符返回真,否则它返回假。