跳到主要内容

PostgreSQL 数组类型教程

PostgreSQL 的数组列可以存储变长列表,支持任意维度,并可用 ANY / ALL 做集合匹配。适合标签、枚举集合等场景。

本篇内容​

  • 定义数组列与字面量写法
  • 访问元素与切片
  • 展开:unnest 与 generate_subscripts
  • 包含判断与 ANY / ALL
  • 多维数组与 GIN 索引

定义与写入​

CREATE TABLE articles (
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
title TEXT NOT NULL,
-- 一维文本数组,默认空数组
tags TEXT[] NOT NULL DEFAULT '{}'
);

INSERT INTO articles (title, tags) VALUES
('PostgreSQL 入门', ARRAY['db', 'sql', 'tutorial']),
('数组详解', '{"db","array"}');

访问与判断​

-- 下标从 1 开始;切片含两端
SELECT tags[1] FROM articles;
SELECT tags[1:2] FROM articles;

-- 包含判断
SELECT * FROM articles WHERE tags @> ARRAY['sql'];
SELECT * FROM articles WHERE 'sql' = ANY (tags);
SELECT * FROM articles WHERE array_length(tags, 1) > 2;

展开与多维​

-- 一行变多行
SELECT id, unnest(tags) AS tag FROM articles;

-- 多维数组
SELECT '{{1,2},{3,4}}'::INTEGER[][];
待补充(TODO)
  • 补充:数组的增删改(array_append / array_remove / || 拼接)与去重
  • 补充:GIN 索引加速 @> 与 ANY 查询的写法
  • 补充:数组 vs 关联表 / JSONB 的选型建议
  • 补充:数组元素为 NULL、空数组与 array_length 的边界行为