Skip to main content

集合函数

generate_series()

PostgreSQL 中的 generate_series() 函数是一个集合返回函数,可根据用户定义的起始值和结束值生成一系列值,适用于生成测试数据或创建数字或时间戳序列。

generate_series() 函数的句法如下:

SELECT * 
FROM generate_series(start, stop, step);

startstopstep 可以是 integerbigintnumerictimestamp 类型。

start 是系列中的第一个值。

stop 是系列中的最后一个值。

除非 startstop 类型为 timestamp,否则 step 为可选项。step 为增量值,若省略,则默认步长值为 1。

下面是一个如何使用 generate_series() 函数生成一系列数字的示例:

SELECT * 
FROM generate_series(1, 5);

结果如下:

1
2
3
4
5

下面是一个步长为 2 的示例:

SELECT * 
FROM generate_series(2, 10, 2);

结果如下:

2
4
6
8
10

下面是如何使用 generate_series() 函数生成一系列时间戳的示例:

SELECT generate_series 
FROM generate_series(
'2008-03-01 00:00:00'::TIMESTAMP,
'2008-03-04 12:00:00'::TIMESTAMP,
interval '12' hour
);

结果如下:

2008-03-01 00:00:00
2008-03-01 12:00:00
2008-03-02 00:00:00
2008-03-02 12:00:00
2008-03-03 00:00:00
2008-03-03 12:00:00
2008-03-04 00:00:00
2008-03-04 12:00:00

range()

PostgreSQL 中的 range() 函数是一个集合返回函数,可根据用户定义的起始值和结束值生成一系列值。与 generate_series() 不同的是,该函数不包含结束值,适用于生成测试数据或创建数字或时间戳序列。

range() 函数的句法如下:

SELECT * 
FROM range(start, stop, step);

startstopstep 可以是 integerbigintnumerictimestamp 类型。

start 是系列中的第一个值。

stop 是系列中的最后一个值。

除非 startstop 类型为 timestamp,否则 step 为可选项。step 为增量值,若省略,则默认步长值为 1。

下面是一个如何使用 range() 函数生成一系列数字的示例:

SELECT * 
FROM range(1, 4);

结果如下:

1
2
3

下面是一个步长为 0.5 的示例:

SELECT * 
FROM range(0.1, 2.1, 0.5);

结果如下:

0.1
0.6
1.1
1.6

下面是如何使用 range() 函数生成一系列时间戳的示例:

SELECT range 
FROM range(
'2008-03-01 00:00:00'::TIMESTAMP,
'2008-03-04 12:00:00'::TIMESTAMP,
interval '12' hour
);

结果如下:

2008-03-01 00:00:00
2008-03-01 12:00:00
2008-03-02 00:00:00
2008-03-02 12:00:00
2008-03-03 00:00:00
2008-03-03 12:00:00
2008-03-04 00:00:00

_pg_expandarray()

_pg_expandarray 函数可接受一个数组作为输入,并将其扩展为一组行,提供数组中的值及其相应的索引。要访问 _pg_expandarray 函数,请确保 information_schema 在搜索路径中。

示例:

SELECT * FROM information_schema._pg_expandarray(Array['a','b','c']);
 x | n 
---+---
a | 1
b | 2
c | 3
(3 rows)

返回的组行中的列:

  • x:数组中的值。

  • n:数组中值的索引。