在数组中搜索
了解 ANY、包含和重叠运算符
在数组中搜索 是 CoddyKit 上的免费 SQL Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Academy 课程共包含 4 节课。
数组存储多个值
在 PostgreSQL 中,数组列可以在单个单元格中存储多个值。在搜索数组中的内容之前,先了解数组的形式会很有帮助。
下面的查询创建了一个表,其中每个产品都可以属于多个类别,这些类别以文本数组的形式存储。
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name TEXT,
tags TEXT[]
);
INSERT INTO products (name, tags) VALUES
('Laptop', ARRAY['electronics', 'computers', 'sale']),
('T-Shirt', ARRAY['clothing', 'summer', 'sale']),
('Coffee Mug', ARRAY['kitchen', 'gifts']),
('Headphones', ARRAY['electronics', 'audio']),
('Notebook', ARRAY['stationery', 'office']);使用 ANY 检查成员关系
ANY 运算符可以让您检查某个值是否出现在数组中的任意位置。语法为:value = ANY(array_column)。
此查询会查找所有带有 electronics 标签的产品。
SELECT name, tags
FROM products
WHERE 'electronics' = ANY(tags);ANY 不仅适用于文本
ANY 适用于支持相等比较的任何数据类型。下面是一个以整数数组存储分数的表。该查询会找出至少有一次测试取得 100 分满分的学生。
CREATE TABLE students (
student TEXT,
scores INT[]
);
INSERT INTO students VALUES
('Alice', ARRAY[88, 95, 100]),
('Bob', ARRAY[70, 80, 90]),
('Carol', ARRAY[100, 100, 99]);
SELECT student, scores
FROM students
WHERE 100 = ANY(scores);使用 NOT + ANY 排除行
要查找某个值不出现在数组中的行,请将 NOT 与 ANY 结合使用。请注意,value <> ANY(arr) 的含义不同——只要有任意元素不同,它就会返回 true,而这种情况几乎总是成立。
请使用 NOT (value = ANY(arr)) 进行可靠的排除检查。
-- Find products that are NOT tagged as 'sale'
SELECT name, tags
FROM products
WHERE NOT ('sale' = ANY(tags));包含运算符 @>
@> 运算符用于检查一个数组是否包含另一个数组中的所有元素。您可以这样理解:左侧数组是否包含右侧列出的每个元素?
此查询会找出同时具有 electronics 和 sale 标签的产品。
SELECT name, tags
FROM products
WHERE tags @> ARRAY['electronics', 'sale'];被包含运算符 <@
<@ 运算符是 @> 的反向运算符。它用于检查左侧数组是否完全包含于右侧数组中。
此查询会找出其完整标签列表属于 electronics, computers, sale 集合子集的产品。
SELECT name, tags
FROM products
WHERE tags <@ ARRAY['electronics', 'computers', 'sale'];重叠运算符 &&
当两个数组至少共享一个元素时,&& 运算符会返回 true。它相当于询问两个列表是否有任何共同内容。
下面的查询会找出至少有一个标签与给定购物列表相同的产品。
SELECT name, tags
FROM products
WHERE tags && ARRAY['audio', 'summer', 'gifts'];重叠与包含的关键区别
很容易混淆 @> 和 &&。下面是清晰的对比:
tags @> ARRAY['a','b']— 该行必须同时包含 'a' 和 'b'。tags && ARRAY['a','b']— 该行只需包含 'a' 或 'b' 中的至少一个。
-- Contains: must have BOTH 'electronics' AND 'sale'
SELECT name FROM products WHERE tags @> ARRAY['electronics', 'sale'];
-- Overlap: must have AT LEAST ONE of 'electronics' or 'sale'
SELECT name FROM products WHERE tags && ARRAY['electronics', 'sale'];使用 array_length 按大小筛选
有时您需要查找数组包含特定数量元素的行。array_length(arr, 1) 返回第一维中的元素数量。
此查询会找出恰好有三个标签的产品。
SELECT name, tags
FROM products
WHERE array_length(tags, 1) = 3;将数组搜索与其他条件结合
数组运算符可以与常规 SQL 条件一起使用。您可以将它们与 AND、OR 以及其他 WHERE 子句谓词组合起来,构建精确的筛选条件。
-- Products tagged 'sale' AND whose name starts with a letter before 'N'
SELECT name, tags
FROM products
WHERE 'sale' = ANY(tags)
AND name < 'N'
ORDER BY name;为数组建立索引以提升速度
对于大型表,如果没有索引,数组搜索可能会很慢。PostgreSQL 的 GIN(通用倒排索引)索引专为数组列设计,可以高效支持 @>、<@ 和 && 运算符。
ANY 不会直接使用 GIN 索引,但重叠和包含运算符会使用它。
-- Create a GIN index on the tags array column
CREATE INDEX idx_products_tags ON products USING GIN (tags);
-- This query can now use the index
SELECT name FROM products WHERE tags @> ARRAY['electronics'];快速检查:数组运算符
测试您对 PostgreSQL 数组搜索运算符的理解。
课程回顾
在本课中,您学习了在 PostgreSQL 数组中进行搜索的三种核心方式:
- = ANY(arr) — 检查单个值是否出现在数组中的任意位置。
- @>(包含)— 检查数组是否包含所有指定元素。
- &&(重叠)— 检查数组是否与另一个数组至少共享一个元素。
您还学习了用于反向包含检查的 <@、用于按大小筛选的 array_length,以及用于加快大型数据集数组搜索的 GIN 索引。将这些运算符与标准 WHERE 条件结合使用,可以让您精确、灵活地控制多值数据。
常见问题解答
「在数组中搜索」课时是免费的吗?
是的 — 「在数组中搜索」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Academy 课程的其余内容,请升级到 CoddyKit PRO。 SQL Academy 课程共包含 4 节课。
「在数组中搜索」这节课中我会学到什么?
了解 ANY、包含和重叠运算符 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 SQL Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 SQL Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「在数组中搜索」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 SQL Academy 课中编写并运行代码吗?
能。每节 SQL Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 数组列基础
- 在数组中搜索
- UNNEST 与聚合
- 数组与规范化表对比