PostgreSQL 常见数组操作函数语法、功能
一、数组创建类:生成新数组
用于直接构造或从其他数据类型转换为数组
1. ARRAY[]
语法:
ARRAY[元素1, 元素2, ...]
功能:直接创建一个数组(最基础的数组构造方式),支持任意数据类型(整数、字符串、日期等)。
SELECT ARRAY[1, 2, 3]; -- 整数数组 -- 结果:{1,2,3}(类型为 integer[]) SELECT ARRAY['a', 'b', 'c']; -- 字符串数组 -- 结果:{a,b,c}(类型为 text[]) SELECT ARRAY[[1,2], [3,4]]; -- 二维数组 -- 结果:{{1,2},{3,4}}(类型为 integer[][])
2. STRING_TO_ARRAY(string, delimiter)
语法:
STRING_TO_ARRAY(字符串, 分隔符)
功能:将字符串按指定分隔符拆分为数组,常用于将逗号 / 空格分隔的字符串转换为数组。
SELECT STRING_TO_ARRAY('apple,banana,orange', ','); -- 结果:{apple,banana,orange}(text[]类型) SELECT STRING_TO_ARRAY('2023-10-01 14:30:00', ' '); -- 结果:{2023-10-01,14:30:00}(拆分日期和时间)
二、数组聚合与拆分类:行与数组的转换
常用于处理 “一对多” 数据关系。
3. ARRAY_AGG(expression)
语法:
ARRAY_AGG(expression [ORDER BY ...] [NULLS {FIRST|LAST}])
功能:聚合函数,将分组后的多行数据的指定列值合并为一个数组(核心聚合函数)。
-- 将每个学生的科目聚合为数组 SELECT name, ARRAY_AGG(subject ORDER BY subject) AS subjects FROM scores GROUP BY name; -- 结果: -- name | subjects -- ------+---------------- -- Alice | {Math,English} -- Bob | {Physics,Math}
4. UNNEST(array)
语法:
UNNEST(数组)
功能:将数组拆分为多行(与
ARRAY_AGG
互为反向操作),常用于数组的行转列。SELECT UNNEST(ARRAY['a', 'b', 'c']); -- 结果(多行): -- a -- b -- c -- 结合表使用:将数组字段拆分为多行 SELECT id, UNNEST(tags) AS tag FROM articles WHERE id = 1; -- 假设 articles.tags 是 {postgres,sql},结果: -- id | tag -- ---+--------- -- 1 | postgres -- 1 | sql
三、数组查询与统计类:获取数组信息
用于查询数组元素位置、统计数组长度或总元素数量
5. ARRAY_LENGTH(array, dimension)
语法:
ARRAY_LENGTH(数组, 维度)
功能:返回数组指定维度的长度(默认维度为 1,即一维数组的元素个数)。
SELECT ARRAY_LENGTH(ARRAY[1,2,3], 1); -- 一维数组长度 -- 结果:3 SELECT ARRAY_LENGTH(ARRAY[[1,2], [3,4], [5,6]], 1); -- 二维数组第一维长度(行数) -- 结果:3(表示有3行) SELECT ARRAY_LENGTH(ARRAY[[1,2], [3,4]], 2); -- 二维数组第二维长度(列数) -- 结果:2(表示每行有2列)
6. CARDINALITY(array)
语法:
CARDINALITY(数组)
功能:返回数组中所有元素的总数量(适用于多维数组,统计所有维度的元素和)。
SELECT CARDINALITY(ARRAY[1,2,3]); -- 一维数组 -- 结果:3 SELECT CARDINALITY(ARRAY[[1,2], [3,4]]); -- 二维数组(2行2列) -- 结果:4(总元素数 2×2=4)
7. ARRAY_POSITION(array, element)
语法:
ARRAY_POSITION(数组, 元素)
功能:返回元素在数组中首次出现的位置(索引从 1 开始,元素不存在则返回
NULL
)。SELECT ARRAY_POSITION(ARRAY['a','b','c'], 'b'); -- 结果:2('b'在第2位) SELECT ARRAY_POSITION(ARRAY[10,20,30], 25); -- 结果:NULL(25不存在)
四、数组修改类:调整数组内容
对已有数组进行元素添加、删除、替换或拼接,生成新的修改后数组(原数组不变)
8. ARRAY_APPEND(array, element)
语法:
ARRAY_APPEND(原数组, 新元素)
功能:在数组的末尾添加一个新元素,返回新数组(原数组不变)。
SELECT ARRAY_APPEND(ARRAY[1,2], 3); -- 结果:{1,2,3} SELECT ARRAY_APPEND(ARRAY['a'], 'b'); -- 结果:{a,b}
9. ARRAY_PREPEND(element, array)
语法:
ARRAY_PREPEND(新元素, 原数组)
功能:在数组的开头添加一个新元素,返回新数组。
SELECT ARRAY_PREPEND(0, ARRAY[1,2]); -- 结果:{0,1,2} SELECT ARRAY_PREPEND('start', ARRAY['middle', 'end']); -- 结果:{start,middle,end}
10. ARRAY_CAT(array1, array2)
语法:
ARRAY_CAT(数组1, 数组2)
功能:拼接两个数组(数组 1 在前,数组 2 在后),返回合并后的新数组。
SELECT ARRAY_CAT(ARRAY[1,2], ARRAY[3,4]); -- 结果:{1,2,3,4} SELECT ARRAY_CAT(ARRAY['a'], ARRAY['b','c']); -- 结果:{a,b,c}
11. ARRAY_REMOVE(array, element)
语法:
ARRAY_REMOVE(数组, 要移除的元素)
功能:移除数组中所有与指定元素相等的元素(区分
NULL
,NULL
需显式指定)。SELECT ARRAY_REMOVE(ARRAY[1,2,2,3], 2); -- 移除所有2 -- 结果:{1,3} SELECT ARRAY_REMOVE(ARRAY['a', NULL, 'a'], NULL); -- 移除所有NULL -- 结果:{a,a}
12. ARRAY_REPLACE(array, old_element, new_element)
语法:
ARRAY_REPLACE(数组, 旧元素, 新元素)
功能:将数组中所有旧元素替换为新元素,返回替换后的数组。
SELECT ARRAY_REPLACE(ARRAY[1,2,1], 1, 0); -- 将所有1替换为0 -- 结果:{0,2,0} SELECT ARRAY_REPLACE(ARRAY['x','y','x'], 'x', 'z'); -- 结果:{z,y,z}
五、数组排序与填充类:标准化数组内容
用于对数组元素排序,或生成固定值、固定维度的数组
13. ARRAY_SORT(array)
语法:
ARRAY_SORT(数组)
(PostgreSQL 9.5+ 支持基础排序,14+ 支持自定义排序)功能:对数组元素进行升序排序(默认按元素本身大小)。
SELECT ARRAY_SORT(ARRAY[3,1,2]); -- 整数排序 -- 结果:{1,2,3} SELECT ARRAY_SORT(ARRAY['c','a','b']); -- 字符串排序 -- 结果:{a,b,c}
14. ARRAY_FILL(value, dimensions)
语法:
ARRAY_FILL(填充值, 维度数组)
功能:生成一个指定维度、并用指定值填充的数组(维度数组表示各维度的长度)。
SELECT ARRAY_FILL(0, ARRAY[3]); -- 一维数组,长度3,填充0 -- 结果:{0,0,0} SELECT ARRAY_FILL('x', ARRAY[2,2]); -- 二维数组(2行2列),填充'x' -- 结果:{{x,x},{x,x}}
六、数组运算符补充
运算符 | 功能说明 | 示例 |
---|---|---|
= | 数组是否完全相等 | ARRAY[1,2] = ARRAY[1,2] |
@> | 数组是否包含另一个数组 | ARRAY[1,2,3] @> ARRAY[2] |
<@ | 数组是否被另一个数组包含 | ARRAY[2] <@ ARRAY[1,2,3] |
&& | 数组是否有交集 | ARRAY[1,2] && ARRAY[2,3] |