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]
相关推荐
时间静止不是简史3 小时前
生产事故排查:Redis 宕机导致补偿队列消费线程死亡,通话录音未上送业务平台
java·redis
2301_32241428046 小时前
基于SpringBoot+Vue的休闲零食超市管理系统的设计与实现59004-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·vue.js·spring boot·redis·mysql·决策树·推荐算法
金銀銅鐵8 小时前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(上)
java·后端·ai编程
福建佰胜张工9 小时前
SMC 薄型气爪 MHF2-16D1 深度解析:平行开闭、低剖面结构在自动化装配中的选型与落地
java·服务器·安全·自动化
catoop9 小时前
API Key 设计与安全生成方案:结构拆解、数据库设计与 Java 实现
java·数据库·安全
system_error_x9 小时前
SpringBoot 集成 Thymeleaf 简洁入门
java·spring boot·后端
驭渊的小故事10 小时前
Spring AI Alibaba 实战:从maven依赖治理到声明式工具调用
java·人工智能·spring
careathers10 小时前
【数据结构】从堆到 PriorityQueue:手写一个优先级队列
数据结构
姚远Oracle ACE10 小时前
为什么无法连接到 PostgreSQL?
数据库·postgresql
ss27310 小时前
AI时代首先数据库-PostgreSQL实战笔记 | 22 PostgreSQL实例与集群
数据库·笔记·postgresql