
文档教程知识库【免费下载链接】til:memo: Today I Learned项目地址https://gitcode.com/gh_mirrors/ti/til点击查看免费下载本文围绕 TIL 仓库中 postgres/defining-arrays.md 记录的核心要点展开系统讲解 PostgreSQL 中数组的两种定义方式——array[...]构造器语法与数组字面量语法并延伸覆盖数组列建表、下标读取、多维数组以及配套的切片、聚合、计数等常用操作。读完本文你将能够熟练地在 psql 会话中定义一维与多维数组、向数组列写入数据并掌握围绕数组的一系列实战技巧。一维数组用array[...]构造器直接定义在 PostgreSQL 中最直观的定义数组的方式是使用array语法即array[...]构造器。将元素以逗号分隔写在一对方括号内即可 select array[a,b,c]; array --------- {a,b,c}这里有两个值得注意的细节array[...]是 PostgreSQL 内建的数组构造器语法元素之间用逗号分隔无需任何引号包裹整体psql 展示数组结果时统一采用{elem1,elem2,elem3}的“花括号字面量”形态这与下文要讲的数组字面量输入语法保持一致——也就是说array[a,b,c]与字面量{a,b,c}表达的是同一份数据。数组列建表、插入与下标读取如果目标不是一次性的 SELECT而是把数组真正存进表里就需要先声明一个数组类型的列。声明方式是在普通类型名后追加一对方括号例如integer[]表示“整数数组列” create temp table favorite_numbers(numbers integer[]); CREATE TABLE向数组列插入数据时可以直接使用数组字面量语法即把一整组元素以花括号形式包起来作为单个值传入 insert into favorite_numbers values( {7,3,9} ); INSERT 0 1随后可以通过下标来读取数组中的某个元素。PostgreSQL 数组的下标从1开始因此numbers[2]取到的是第二个元素3 select numbers[2] from favorite_numbers; numbers --------- 3结合仓库中的 postgres/getting-a-slice-of-an-array.md 可以看到PostgreSQL 数组“下标从 1 起、区间含端点”的语义是一以贯之的切片语法[下界:上界]同样遵循 1-based 且含端点inclusive的规则。如果读取的下标越界PostgreSQL 会返回 NULL 而不是报错这也是数组下标使用中需要留意的行为差异。多维数组嵌套的array构造器PostgreSQL 原生支持多维数组。定义二维数组的方式是把多个一维array构造器再嵌套进外层array构造器每一行用一对[...]表示select array[[1,2,3],[4,5,6],[7,8,9]] telephone; telephone --------------------------- {{1,2,3},{4,5,6},{7,8,9}}多维数组在字面量/输出形态上表现为“花括号层层嵌套”外层花括号包含三行每行内部又是一个花括号括起来的三个元素。这里的telephone是结果列的别名与数组定义本身无关只是演示了如何给结果列命名。同样的嵌套规则适用于更高的维度——三维数组即三层array构造器嵌套、输出时三层花括号嵌套。需要理解的是array[[1,2,3],[4,5,6],[7,8,9]]这类写法在定义上要求内层各数组长度一致才能构成规则的矩形多维结构。对多维数组的切片与取数多维数组同样支持下标读取与切片。读取二维数组某个元素时按下标维度逐层指定即可而切片操作在仓库文档 postgres/getting-a-slice-of-an-array.md 中有更完整的演示例如从 3×3 的二维数组中截取一个 2×2 的矩形子块 select (array[[1,2,3],[4,5,6],[7,8,9]])[2:3][1:2]; array --------------- {{4,5},{7,8}}该文档特别强调一个易错点对array[...]构造器做切片时必须给整个数组构造器加上一层圆括号即写成(array[...])[下界:上界]否则切片语法会被解析器误解而导致出错。数组在 PostgreSQL 类型体系中的位置数组在 PostgreSQL 中并不是一个孤立的数据类型而是内建的一种类型类别。仓库中的 postgres/types-by-category.md 指出PostgreSQL 的众多类型按类别category划分数组Array、布尔Boolean、字符串String、数值Numeric、复合Composite等各自属于一类并且每个类别在pg_type目录中都有对应的类别代码。实践中任何一种基础类型如integer、text、date都会自动存在对应的数组版本声明列时在类型名后追加[]如integer[]、text[]即可引用——这是 PostgreSQL 相比许多其他数据库在数组支持上的一个重要特性即数组可以基于任何类型自由组合包括用户自定义类型。围绕数组定义的配套操作掌握了数组的“定义”之后仓库中还有若干与之直接配套的 TIL 笔记可以在实战中组合使用把一列聚合为数组postgres/aggregate-a-column-into-an-array.md 演示了用聚合函数array_agg将查询结果的某一列聚合成一个数组例如select array_agg(num) from generate_series(1,5) as num;会得到{1,2,3,4,5}非常适合把明细行压缩成数组后交给应用层处理。统计数组元素个数postgres/count-the-number-of-items-in-an-array.md 对比了两种计数方式array_length(array, 维度)需要显式指定在第几维上取长度cardinality(array)则直接返回整个数组的总元素数多维数组也把各层元素全部累加使用更省心。由两个数组构造 hstorepostgres/create-hstore-from-two-arrays.md 展示了hstore(array[one,two,three], array[1,2,3])这种用“键数组 值数组”组合出键值对映射的用法且两个数组长度必须一致否则会抛出arrays must have same bounds错误。这些笔记共同勾勒出 PostgreSQL 数组能力的完整使用链路定义本文→ 存取与切片 → 聚合生成 → 统计与转换。易错点小结下标从 1 开始arr[1]是第一个元素越界读取返回 NULL。切片含端点arr[2:4]包含第 2、3、4 个元素且 1-based。切片需加圆括号对array[...]构造器切片时必须写(array[...])[下界:上界]。字面量形态统一插入数组列使用{...}字面量当数组中包含逗号、空格或空字符串时文本型元素需用双引号包裹如{a,b,c}以免被字面量解析器误切分。多维数组需规则矩形用嵌套array构造器定义多维数组时各内层数组长度应保持一致。延伸阅读本文主体内容源自 postgres/defining-arrays.md与其配套的数组主题笔记均位于仓库postgres/目录下可按需查阅postgres/getting-a-slice-of-an-array.md数组切片与二维数组矩形截取postgres/aggregate-a-column-into-an-array.mdarray_agg列聚合postgres/count-the-number-of-items-in-an-array.mdarray_length与cardinalitypostgres/create-hstore-from-two-arrays.md双数组构造 hstorepostgres/types-by-category.mdPostgreSQL 类型类别体系赞分享文档教程知识库【免费下载链接】til:memo: Today I Learned项目地址https://gitcode.com/gh_mirrors/ti/til点击查看免费下载相关推荐freeCodeCamp Basic JavaScript 精讲数组嵌套与多维数组Nest one Array within Another ArrayfreeCodeCamp Basic JavaScript 精讲数组嵌套与多维数组Nest one Array within Another Array前端后端教育如何高效使用std::arrayC固定大小数组的终极指南如何高效使用std::arrayC固定大小数组的终极指南 在现代C编程中 std::array 作为一种固定大小的数组容器为开发者提供了兼具C风格文档教程Pixelle-VideoAI短视频引擎安装、核心功能与进阶调优Pixelle VideoAI短视频引擎安装、核心功能与进阶调优 Pixelle Video 是一个开源的 AI 短视频生成引擎输入一个主题它自动完成文案人工智能AI 应用音视频媒体生成创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考