PostgreSQL的数组类型允许在单个字段中存储多个同数据类型的元素,支持一维、多维数组,元素类型可以是基础类型如整数、文本,也可以是自定义类型,非常适合存储标签、多值属性这类场景。
PostgreSQL数组结构说明
PostgreSQL数组的结构由元素类型和维度共同决定,声明数组类型时可以在基础类型后加方括号,方括号的数量代表数组的维度。比如integer[]表示一维整数数组,text[][]表示二维文本数组。数组的下标默认从1开始,也支持自定义下标范围,不过实际使用中大多采用默认的1起始下标。
数组的元素可以是任意合法的PostgreSQL数据类型,包括整数、文本、日期、甚至其他数组,但是同一个数组内的所有元素必须是同一类型。数组在存储时会保留元素的顺序,查询时可以按照下标获取指定位置的元素。
数组的创建操作
建表时定义数组字段
创建数据表时可以直接指定字段为数组类型,示例如下:
-- 创建用户表,包含标签数组和得分数组字段
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
tags TEXT[], -- 一维文本数组,存储用户标签
scores INTEGER[][] -- 二维整数数组,存储多科多次得分
);
插入数组数据
插入数组数据时可以用数组构造函数ARRAY[],也可以直接用花括号包裹元素,元素之间用逗号分隔,示例如下:
-- 方式1:使用ARRAY构造函数插入
INSERT INTO users (name, tags, scores) VALUES
('张三', ARRAY['学生', '篮球'], ARRAY[[80, 85], [90, 88]]);
-- 方式2:使用花括号格式插入
INSERT INTO users (name, tags, scores) VALUES
('李四', '{"教师", "书法"}', '{{75, 82}, {88, 90}}');
数组的查询操作
按下标查询元素
可以通过下标直接获取数组中的指定元素,下标写在方括号内,示例如下:
-- 查询第一个用户的第一个标签 SELECT name, tags[1] AS first_tag FROM users WHERE id = 1; -- 查询第一个用户的第一次考试的第一科得分 SELECT name, scores[1][1] AS first_score FROM users WHERE id = 1;
查询数组包含指定元素
可以使用ANY关键字或者@>包含操作符判断数组是否包含某个元素,示例如下:
-- 查询所有包含"篮球"标签的用户 SELECT name FROM users WHERE '篮球' = ANY(tags); -- 使用包含操作符查询,效果同上 SELECT name FROM users WHERE tags @> ARRAY['篮球'];
展开数组元素
使用unnest函数可以将数组展开为多行,每个元素对应一行,示例如下:
-- 展开所有用户的标签,每个标签一行 SELECT name, unnest(tags) AS tag FROM users;
数组的修改操作
修改指定下标的元素
可以直接通过下标赋值修改数组中指定位置的元素,示例如下:
-- 修改id为1的用户的第一个标签为"程序员" UPDATE users SET tags[1] = '程序员' WHERE id = 1;
追加元素到数组
使用array_append函数可以在数组末尾追加元素,使用||操作符也可以实现追加,示例如下:
-- 给id为1的用户追加"健身"标签 UPDATE users SET tags = array_append(tags, '健身') WHERE id = 1; -- 使用||操作符追加,效果同上 UPDATE users SET tags = tags || '健身' WHERE id = 1;
合并两个数组
使用array_cat函数或者||操作符可以合并两个数组,示例如下:
-- 合并两个标签数组
SELECT array_cat(ARRAY['a', 'b'], ARRAY['c', 'd']); -- 结果:{a,b,c,d}
SELECT ARRAY['a', 'b'] || ARRAY['c', 'd']; -- 结果:{a,b,c,d}
数组的删除操作
PostgreSQL没有直接的数组元素删除函数,通常可以通过数组切片或者过滤的方式实现,示例如下:
-- 删除tags数组的第一个元素,取从第二个元素开始的所有元素 UPDATE users SET tags = tags[2:array_length(tags, 1)] WHERE id = 1; -- 过滤掉数组中等于"健身"的元素 UPDATE users SET tags = ARRAY(SELECT unnest(tags) EXCEPT SELECT '健身') WHERE id = 1;
常用数组函数说明
以下是PostgreSQL中常用的数组相关函数:
| 函数名 | 作用说明 | 示例 |
|---|---|---|
| array_length(arr, dim) | 获取指定维度数组的长度,dim为维度编号 | array_length(ARRAY[1,2,3], 1) 返回3 |
| array_dims(arr) | 返回数组的维度信息字符串 | array_dims(ARRAY[[1,2],[3,4]]) 返回[1:2][1:2] |
| array_prepend(elem, arr) | 在数组开头插入元素 | array_prepend(0, ARRAY[1,2]) 返回{0,1,2} |
| array_remove(arr, elem) | 删除数组中所有等于指定值的元素 | array_remove(ARRAY[1,2,2,3], 2) 返回{1,3} |
PostgreSQL数组类型数组操作数组结构修改时间:2026-07-14 16:27:38