Skip to content

PostgreSQL - ANY 运算符

PostgreSQL 中的 ANY 运算符是一个强大的工具,用于将标量值与一组值进行比较,这组值可以由数组或子查询提供。它简化了那些原本需要多个 OR 条件的查询。

ANY 运算符在比较集合中至少一个值为真时返回 TRUE。如果对所有值都为假或集合为空时,它返回 FALSE。

ANY 运算符在标准比较运算符(=、<>、<、>、<=、>=)之后使用:

scalar_expression operator ANY (array_expression)
-- 或
scalar_expression operator ANY (subquery)

= ANY(...) 结构等同于 IN 运算符,但 ANY 可以与任何比较运算符一起使用,使其更加通用。

让我们创建一个表来管理求职者及其技能和测试分数。这是数组数据类型和 ANY 运算符的完美用例。

CREATE TABLE candidates(
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
skills TEXT[],
scores INT[]
);
INSERT INTO candidates(name, skills, scores) VALUES
('Alice', ARRAY['Python', 'SQL', 'GCP'], ARRAY[85, 90, 75]),
('Bob', ARRAY['Java', 'PostgreSQL'], ARRAY[70, 80, 95]),
('Charlie', ARRAY['Go', 'SQL', 'Docker'], ARRAY[65, 75, 85]),
('Diana', ARRAY['C++', 'Python'], ARRAY[80, 85, 90]);

用例 1:查找具有特定技能的求职者

Section titled “用例 1:查找具有特定技能的求职者”

我们想找到所有将“SQL”列为其中一项技能的求职者。使用 ANY 比尝试对照数组的文本表示进行匹配要清晰得多。

SELECT name, skills
FROM candidates
WHERE 'SQL' = ANY(skills);

此查询产生以下输出:

姓名技能
Alice{Python,SQL,GCP}
Charlie{Go,SQL,Docker}

现在,让我们找出在至少一项测试中得分 90 或更高的求职者。这里我们使用 ANY 和 >= 运算符。

SELECT name, scores
FROM candidates
WHERE 90 <= ANY(scores);

此查询返回至少有一个分数达到或超过 90 分的求职者。

姓名分数
Alice{85,90,75}
Bob{70,80,95}
Diana{80,85,90}

ANY 运算符也常与子查询一起使用。例如,让我们找出所有分数高于 Charlie 任何一个分数的求职者。

SELECT name, scores
FROM candidates
WHERE id <> 3 AND scores > ANY (
SELECT scores FROM candidates WHERE name = 'Charlie'
);

此查询找到所有(不包括 Charlie)至少有一个分数高于 65、75 或 85 的求职者。本质上,就是任何分数高于 65 的人。