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(数组, 要移除的元素)

  • 功能 :移除数组中所有与指定元素相等的元素(区分 NULLNULL 需显式指定)。

    复制代码
    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]
相关推荐
yudiandian20143 小时前
02 Oracle JDK 下载及配置(解压缩版)
java·开发语言
楚韵天工3 小时前
宠物服务平台(程序+文档)
java·网络·数据库·spring cloud·编辑器·intellij-idea·宠物
helloworddm3 小时前
Orleans Stream SubscriptionId 生成机制详解
java·系统架构·c#
失散133 小时前
分布式专题——43 ElasticSearch概述
java·分布式·elasticsearch·架构
ajsbxi4 小时前
【Java 基础】核心知识点梳理
java·开发语言·笔记
无敌最俊朗@4 小时前
数组-力扣hot56-合并区间
数据结构·算法·leetcode
聪明的笨猪猪4 小时前
Java JVM “调优” 面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
重整旗鼓~4 小时前
28.redisson源码分析分布式锁
java·开发语言
Query*4 小时前
Java 设计模式——工厂模式:从原理到实战的系统指南
java·python·设计模式