generate_series
生成由 start
和 end
指定的间隔内的一系列值,并具有可选的 step
。
generate_series() 是一个表函数。对于每个输入行,表函数可以返回一个行集。 行集可以包含零行、一行或多行。 每行可以包含一列或多列。
要在 StarRocks 中使用 generate_series(),如果输入参数是常量,则必须将其括在 TABLE 关键字中。 如果输入参数是表达式(例如列名),则不需要 TABLE 关键字(请参阅示例 5)。
此函数从 v3.1 开始支持。
语法
generate_series(start, end [,step])
参数
start
:系列的起始值,必需。 支持的数据类型为 INT、BIGINT 和 LARGEINT。end
:系列的结束值,必需。 支持的数据类型为 INT、BIGINT 和 LARGEINT。step
:递增或递减的值,可选。 支持的数据类型为 INT、BIGINT 和 LARGEINT。 如果未指定,则默认步长为 1。step
可以是负数或正数,但不能为零。
这三个参数必须具有相同的数据类型,例如,generate_series(INT start, INT end [, INT step])
。
它从 v3.3 开始支持命名参数,其中所有参数都使用名称输入,例如 name=>expr
,例如 generate_series(start=>3, end=>7, step=>2)
。 命名参数可以对参数进行排序并可选择性地设置默认参数,但不能与位置参数混合使用。
返回值
返回与输入参数 start
和 end
相同的一系列值。
- 当
step
为正数时,如果start
大于end
,则返回零行。 反之,当step
为负数时,如果start
小于end
,则返回零行。 - 如果
step
为 0,则返回错误。 - 此函数按如下方式处理 Null:如果任何输入参数是文字 Null,则报告错误。 如果任何输入参数是表达式并且表达式的结果为 Null,则返回 0 行(请参阅示例 5)。
示例
示例 1:以默认步长 1
按升序生成 [2,5] 范围内的一系列值。
MySQL > select * from TABLE(generate_series(2, 5));
+-----------------+
| generate_series |
+-----------------+
| 2 |
| 3 |
| 4 |
| 5 |
+-----------------+
示例 2:以指定的步长 2
按升序生成 [2,5] 范围内的一系列值。
MySQL > select * from TABLE(generate_series(2, 5, 2));
+-----------------+
| generate_series |
+-----------------+
| 2 |
| 4 |
+-----------------+
示例 3:以指定的步长 -1
按降序生成 [5,2] 范围内的一系列值。
MySQL > select * from TABLE(generate_series(5, 2, -1));
+-----------------+
| generate_series |
+-----------------+
| 5 |
| 4 |
| 3 |
| 2 |
+-----------------+
示例 4:当 step
为负数且 start
小于 end
时,将返回零行。
MySQL > select * from TABLE(generate_series(2, 5, -1));
Empty set (0.01 sec)
示例 5:使用表列作为 generate_series() 的输入参数。 在此用例中,您不需要将 TABLE()
与 generate_series() 一起使用。
CREATE TABLE t_numbers(start INT, end INT)
DUPLICATE KEY (start)
DISTRIBUTED BY HASH(start) BUCKETS 1;
INSERT INTO t_numbers VALUES
(1, 3),
(5, 2),
(NULL, 10),
(4, 7),
(9,6);
SELECT * FROM t_numbers;
+-------+------+
| start | end |
+-------+------+
| NULL | 10 |
| 1 | 3 |
| 4 | 7 |
| 5 | 2 |
| 9 | 6 |
+-------+------+
-- Generate multiple rows for rows (1,3) and (4,7) with step 1.
SELECT * FROM t_numbers, generate_series(t_numbers.start, t_numbers.end);
+-------+------+-----------------+
| start | end | generate_series |
+-------+------+-----------------+
| 1 | 3 | 1 |
| 1 | 3 | 2 |
| 1 | 3 | 3 |
| 4 | 7 | 4 |
| 4 | 7 | 5 |
| 4 | 7 | 6 |
| 4 | 7 | 7 |
+-------+------+-----------------+
-- Generate multiple rows for rows (5,2) and (9,6) with step -1.
SELECT * FROM t_numbers, generate_series(t_numbers.start, t_numbers.end, -1);
+-------+------+-----------------+
| start | end | generate_series |
+-------+------+-----------------+
| 5 | 2 | 5 |
| 5 | 2 | 4 |
| 5 | 2 | 3 |
| 5 | 2 | 2 |
| 9 | 6 | 9 |
| 9 | 6 | 8 |
| 9 | 6 | 7 |
| 9 | 6 | 6 |
+-------+------+-----------------+
示例 6:使用命名参数,以指定的步长 2
按升序生成 [2,5] 范围内的一系列值。
MySQL > select * from TABLE(generate_series(start=>2, end=>5, step=>2));
+-----------------+
| generate_series |
+-----------------+
| 2 |
| 4 |
+-----------------+
关键字
table function, generate series