- 文档
- 教程
- 知识库
【免费下载链接】til
:memo: Today I Learned
generate_series是 PostgreSQL 内置的集合返回函数(set-returning function),核心用途是按规则"生成一串东西"——既可以是连续的整数,也可以是带有自定义步进的等差数列。本文以 til 仓库中 generate-series-of-numbers.md 为主线,完整讲解start、stop、step三参数的用法,并结合仓库内其他 PostgreSQL 笔记(批量造数、列聚合、函数重载列表)给出可直接复用的实战扩展。
基础用法:只传 start 和 stop
generate_series最简单的调用方式是只提供两个参数:起始值start和结束值stop。它会从start开始,以默认步进1逐个生成,直到超过stop为止:
> select generate_series(1,5); generate_series ----------------- 1 2 3 4 5得到的是一个 5 行的结果集,每行一个整数。这个最简单的形态就是后续所有复杂场景的基石。
反向计数:指定负步进
默认步进是1,所以如果想倒着数,就必须显式传入第三个参数——一个负的步进值。例如generate_series(5,1,-1)会从 5 递减到 1:
> select generate_series(5,1,-1); generate_series ----------------- 5 4 3 2 1注意:当start > stop且步进为正时不会产生任何行;反向序列必须配合负步进使用。
自定义步进:生成倍数列
步进参数不仅可以取负值,还可以取任意大于 1 的整数值。比如想只取 3 的倍数,可以用generate_series(3,17,3),从 3 开始每次加 3,直到超过上限 17:
> select generate_series(3,17,3); generate_series ----------------- 3 6 9 12 15这里最后一个生成值 15 小于 17,是因为 18 已经超出stop边界,体现了"不超过 stop 即停止"的规则。同理,generate_series(1,10,3)只会得到 1、4、7、10。
函数的全部重载版本
generate_series并非只有一个签名,它针对不同数据类型提供了多个重载版本。在 psql 中可以用\df查看,仓库笔记 list-all-versions-of-a-function.md 中记录了\df generate_series的完整输出,可以概括为 6 个版本:
| 参数类型 | 返回类型 |
|---|---|
bigint, bigint | SETOF bigint |
bigint, bigint, bigint | SETOF bigint |
integer, integer | SETOF integer |
integer, integer, integer | SETOF integer |
timestamp with time zone, timestamp with time zone, interval | SETOF timestamp with time zone |
timestamp without time zone, timestamp without time zone, interval | SETOF timestamp without time zone |
前四个版本对应本文演示的整数序列;最后两个版本接受时间戳加interval步进,正是原文档末尾"用时间戳试试"留给读者的练习方向——调用形如generate_series('2024-01-01', '2024-01-05', interval '1 day'),此时第三个参数必须是interval类型而不能是整数。
实战扩展:在 FROM 子句中生成行
generate_series最常见的进阶用法是出现在FROM子句里,当作一张"虚拟表"使用,并为列起别名。仓库笔记 aggregate-a-column-into-an-array.md 演示了这种写法:
> select num from generate_series(1,5) as num; num ----- 1 2 3 4 5between-symmetric.md 中则用了带列名的别名形式from generate_series(1,10) as numbers(a),可以直接引用a列参与后续计算。这种"序列即行集"的思维,让generate_series成为数据生成和数值计算的通用底座。
实战扩展:批量造数插入表
生成序列最实用的场景之一,是用INSERT ... SELECT快速插入海量测试数据。仓库笔记 insert-a-bunch-of-records-with-generate-series.md 提供了一个真实案例:向roles表一次性插入 54000 行,用于压测查询性能:
> insert into roles ( name, resource_id, resource_type, created_at, updated_at ) select 'organization_user', g.id, 'Organization', now(), now() from generate_series(1,54000) as g(id);核心思路是:generate_series(1,54000)在FROM中产出 54000 个递增 id,SELECT再混合静态值(如固定的name、resource_type)与动态时间戳,拼出足够真实的假数据写回表里。调整左右边界即可控制行数,是填充种子数据、复现性能问题的常用手法。
小结
- 两参数形式
generate_series(start, stop)生成步进为 1 的递增整数序列; - 反向计数必须显式传负步进,如
generate_series(5,1,-1); - 三参数形式可生成任意等差序列,如
generate_series(3,17,3); - 整数与时间戳各有独立重载版本,时间戳版本要求第三个参数为
interval; - 在
FROM子句中结合列别名使用,可衔接INSERT、array_agg等场景完成批量造数与聚合分析。
相关仓库笔记可继续阅读:insert-a-bunch-of-records-with-generate-series.md、aggregate-a-column-into-an-array.md、list-all-versions-of-a-function.md、between-symmetric.md。
- 文档
- 教程
- 知识库
【免费下载链接】til
:memo: Today I Learned
相关推荐
TIL 笔记深化:macOS `say` 命令实战——列出全部音色、切换语音与生成语音文件
TIL 笔记深化:macOS say 命令实战——列出全部音色、切换语音与生成语音文件 say 是 macOS 内置的命令行文本转语音(Text to Spee
文档教程知识库在 PostgreSQL 中统计某列单词数量:regexp_split_to_array 组合查询实战(til 仓库笔记详解)
在 PostgreSQL 中统计某列单词数量:regexp_split_to_array 组合查询实战(til 仓库笔记详解) 本篇技术指南围绕 til 仓库
文档教程知识库til 仓库 PostgreSQL 实战:使用 array_agg 将一列聚合成数组
til 仓库 PostgreSQL 实战:使用 array_agg 将一列聚合成数组 array_agg 是 PostgreSQL 内置的聚合函数,用于把一组行
文档教程知识库
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考