前置知识: SQL

数组类型操作语法速查手册

1 min入门

数组类型操作 语法速查手册 的完整教学讲解。

数组定义与构造

基本写法:建表定义数组列 <列名> <元素类型>[]

-- 定义整型数组和文本数组列
CREATE TABLE projects (
  id SERIAL PRIMARY KEY,
  tags TEXT[],
  member_ids BIGINT[],
  scores INTEGER[]
);

基本写法:数组字面量构造 ARRAY[<值1>, <值2>, ...] 或 '{<值1>,<值2>,...}'

-- 使用 ARRAY 构造器(推荐)
INSERT INTO projects (tags) VALUES (ARRAY['java','spring','web']);
-- 使用字符串字面量
INSERT INTO projects (tags) VALUES ('{java,spring,web}');

基本写法:从子查询构造数组 ARRAY(SELECT <列> FROM <表> WHERE <条件>)

-- 将查询结果转为数组
SELECT id, ARRAY(SELECT name FROM users WHERE dept_id = 1) AS dept_members;

基本写法:多维数组 <元素类型>[][]

-- 二维数组
CREATE TABLE matrix (data INTEGER[][]);
INSERT INTO matrix VALUES (ARRAY[[1,2],[3,4]]);

数组访问

基本写法:按下标访问元素 <数组列>[<下标>]

-- PostgreSQL 数组下标从 1 开始
SELECT tags[1] AS first_tag FROM projects WHERE id = 1;
SELECT member_ids[1:3] AS first_three FROM projects WHERE id = 1;  -- 切片

基本写法:获取数组长度 array_length(<数组列>, <维度>)

-- 获取第一维长度
SELECT array_length(tags, 1) AS tag_count FROM projects;
-- 获取多维数组各维长度
SELECT array_length(data, 1), array_length(data, 2) FROM matrix;

基本写法:数组展开为行 unnest(<数组列>)

-- 将数组展开为多行(常用于关联查询)
SELECT id, unnest(tags) AS tag FROM projects;
-- 多数组同步展开
SELECT id, tag, score
FROM projects
CROSS JOIN unnest(tags, scores) AS t(tag, score);

数组包含与匹配

基本写法:包含元素判断 <值> = ANY(<数组>) / <数组> @> <数组>

-- 是否包含任一等于该值的元素
SELECT * FROM projects WHERE 'java' = ANY(tags);
-- 是否包含指定子集(@> 包含)
SELECT * FROM projects WHERE tags @> ARRAY['java','spring'];
-- 是否被包含(<@)
SELECT * FROM projects WHERE ARRAY['java'] <@ tags;

基本写法:重叠判断 <数组> && <数组>

-- 两个数组是否有公共元素(存在交集)
SELECT * FROM projects WHERE tags && ARRAY['java','python'];

基本写法:查找元素位置 array_position(<数组>, <值>)

-- 返回元素首次出现的下标(从 1 开始)
SELECT array_position(tags, 'spring') FROM projects WHERE id = 1;
-- 所有出现位置
SELECT array_positions(tags, 'java') FROM projects;

数组修改

基本写法:连接数组 <数组1> || <数组2>

-- 数组连接
SELECT ARRAY[1,2] || ARRAY[3,4] AS result;  -- {1,2,3,4}
-- 追加元素
SELECT tags || 'new_tag' FROM projects WHERE id = 1;

基本写法:追加元素 array_append(<数组>, <值>)

-- 在末尾追加元素
UPDATE projects SET tags = array_append(tags, 'microservice') WHERE id = 1;

基本写法:删除元素 array_remove(<数组>, <值>)

-- 删除所有匹配元素
UPDATE projects SET tags = array_remove(tags, 'deprecated') WHERE id = 1;

基本写法:替换元素 array_replace(<数组>, <旧值>, <新值>)

-- 替换所有匹配元素
UPDATE projects SET tags = array_replace(tags, 'old', 'new') WHERE id = 1;

基本写法:数组去重 ARRAY(SELECT DISTINCT unnest(<数组>))

-- 数组去重
SELECT id, ARRAY(SELECT DISTINCT unnest(tags)) AS unique_tags FROM projects;

数组函数

基本写法:数组转字符串 array_to_string(<数组>, <分隔符> [, <NULL替代>])

-- 拼接为逗号分隔字符串
SELECT array_to_string(tags, ', ') AS tag_str FROM projects;
-- NULL 用占位符替代
SELECT array_to_string(scores, ',', 'N/A') FROM projects;

基本写法:字符串转数组 string_to_array(<字符串>, <分隔符>)

-- 按分隔符拆分为数组
SELECT string_to_array('a,b,c', ',') AS arr;  -- {a,b,c}

基本写法:数组聚合 array_agg(<列>)

-- 将分组内的值聚合为数组
SELECT dept_id, array_agg(user_name) AS members
FROM users GROUP BY dept_id;

基本写法:数组与集合运算 array_cat / array_intersect / array_union

-- 数组并集
SELECT ARRAY(SELECT unnest(ARRAY[1,2,3]) UNION SELECT unnest(ARRAY[3,4,5]));
-- 数组交集
SELECT ARRAY(SELECT unnest(ARRAY[1,2,3]) INTERSECT SELECT unnest(ARRAY[2,3,4]));

数组索引

基本写法:创建 GIN 索引加速数组查询 CREATE INDEX <索引名> ON <表名> USING GIN (<数组列>);

-- 为数组列建 GIN 索引(支持 @>、&& 等操作符)
CREATE INDEX idx_projects_tags ON projects USING GIN (tags);
-- 使用索引加速包含查询
SELECT * FROM projects WHERE tags @> ARRAY['java'];