PostgreSQL 教程: ANY 运算符

九月 4, 2023

摘要:在本教程中,您将学习如何使用 PostgreSQL 的ANY运算符将标量值与子查询返回的一组值进行比较。

PostgreSQL ANY 运算符简介

PostgreSQL 的ANY运算符将一个值与子查询返回的一组值进行比较。下面说明了ANY运算符的语法:

expresion operator ANY(subquery)

在这个语法中:

  • 子查询必须恰好返回一列。
  • ANY运算符前面必须有以下比较运算符之一:=、<=、>、<、> 和 <>。
  • 如果子查询的任何值满足条件,则ANY运算符返回 true,否则返回 false。

请注意,SOMEANY的同义词,这意味着您可以在任何 SQL 语句中使用SOME替换ANY

PostgreSQL ANY 示例

我们将使用示例数据库中的filmfilm_category表进行演示,如下。

film and film_category table

以下示例返回按影片类别分组的影片的最大长度:

SELECT
    MAX( length )
FROM
    film
INNER JOIN film_category
    USING(film_id)
GROUP BY
    category_id;

您可以将此查询用作以下语句中的子查询,该语句查找长度大等于任何电影类别最大长度的电影:

SELECT title
FROM film
WHERE length >= ANY(
    SELECT MAX( length )
    FROM film
    INNER JOIN film_category USING(film_id)
    GROUP BY  category_id );

结果如下:

PostgreSQL ANY example

对于每个电影类别,子查询查找最大长度。外部查询查看所有这些值,并确定哪部电影的长度大等于任何电影类别的最大长度。

请注意,如果子查询不返回任何行,则整个查询将返回空结果集。

ANY 对比 IN

= ANY相当于运算符IN

以下示例获取类别为ActionDrama的电影。

SELECT
    title,
    category_id
FROM
    film
INNER JOIN film_category
    USING(film_id)
WHERE
    category_id = ANY(
        SELECT
            category_id
        FROM
            category
        WHERE
            NAME = 'Action'
            OR NAME = 'Drama'
    );

结果是:

PostgreSQL ANY and IN example

以下语句使用产生相同结果的IN运算符:

SELECT
    title,
    category_id
FROM
    film
INNER JOIN film_category
    USING(film_id)
WHERE
    category_id IN(
        SELECT
            category_id
        FROM
            category
        WHERE
            NAME = 'Action'
            OR NAME = 'Drama'
    );

请注意,<> ANY运算符与NOT IN不同。下面的表达式:

x <> ANY (a,b,c)

相当于

x <> a OR <> b OR x <> c

在本教程中,您学习了如何使用 PostgreSQL 的ANY运算符,将值与子查询返回的一组值进行比较。