跳到主要内容
版本: 最新版本-3.5

generate_series

生成由 startend 指定的间隔内的一系列值,并具有可选的 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)。 命名参数可以对参数进行排序并可选择性地设置默认参数,但不能与位置参数混合使用。

返回值

返回与输入参数 startend 相同的一系列值。

  • 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