0Pricing
SQL Academy · 课时

在数组中搜索

了解 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 数组列基础
  2. 在数组中搜索
  3. UNNEST 与聚合
  4. 数组与规范化表对比
← 返回 SQL Academy