跳到主要内容

集合返回函数

集合返回函数(SRF)一次调用产生零行或多行,最清楚的写法是把它放在 FROM 中当作数据源;不要把它误认为返回一个数组的标量函数。

生成序列​

SELECT n FROM generate_series(1, 5, 2) AS g(n);
-- 1、3、5
SELECT day FROM generate_series(
timestamp '2025-03-01', timestamp '2025-03-03', interval '1 day'
) AS g(day);

上下界通常都包含;正步长遇到起点大于终点、负步长遇到起点小于终点时返回零行,步长为零报错。日期时间序列遇到夏令时或月份间隔时需确定要按日历时间还是固定时长生成。

展开数组与关联每行​

SELECT t.id, tag
FROM tasks AS t
CROSS JOIN LATERAL unnest(t.tags) AS u(tag);

LATERAL 使右侧函数可引用左侧行;这里空数组或 NULL 数组使该任务不出现在结果中。要保留没有标签的任务,可改用 LEFT JOIN LATERAL unnest(t.tags) AS u(tag) ON true。多参数 unnest(a, b) 并列展开,短数组以 NULL 补齐,仅能在 FROM 中以这种形式使用。

常见边界​

generate_subscripts(array, dimension) 产生实际下标,适合下界不一定为 1 的数组;jsonb_array_elements 将 JSON 数组展开。函数放在 SELECT 列表中也可能产生多行,但与多个 SRF、普通表达式组合的行为不如 FROM ... LATERAL 直观,建议统一放在 FROM。展开会倍增行数,后续 JOIN、聚合及分页应明确作用于展开前还是展开后。