类别:

表函数

GENERATOR

根据指定的行数和/或指定的生成周期(以秒为单位)创建数据行。此系统定义的表函数支持合成行生成。

请注意,可以生成具有 0 列但可能包含许多行的虚拟表。此类虚拟表对于其 SELECT 子句完全由数据生成函数组成的查询非常有用。

语法

GENERATOR( ROWCOUNT => <count> [ , TIMELIMIT => <sec> ] )

GENERATOR( [ TIMELIMIT => <sec> ] )
Copy

使用说明

  • countsec 必须是非负整数常量。

  • 如果仅指定 ROWCOUNT 实参,则生成的表将包含 count 行。

  • 如果仅指定 TIMELIMIT 实参,则查询将运行 sec 秒,在该时间范围内生成尽可能多的行。确切的行数取决于系统速度,且并非完全确定。

  • 若同时指定了 ROWCOUNTTIMELIMIT 实参,那么:

    • 若在 TIMELIMIT 之前达到 ROWCOUNT,则生成的表将包含 count 行。

    • 若在 ROWCOUNT 之前达到 TIMELIMIT,则该表将包含时间范围内生成的行数。确切的行数取决于系统速度,且并非完全确定。

  • 如果 ROWCOUNTTIMELIMIT 为 NULL,则将忽略它。因此 generator(ROWCOUNT => null) 生成 0 行。

  • 如果忽略两个参数(ROWCOUNTTIMELIMIT),则该 GENERATOR 函数返回 0 行。

  • 行的内容由投影子句中的函数确定,而非由 GENERATOR 函数本身确定。有关更多信息,请参阅下面的“示例”部分。另请参阅您计划在投影子句中使用的特定函数(例如 SEQ())的描述;并非所有有效函数都能生成没有间隙的序列

示例

备注

这些示例生成可能存在间隙的序列。有关生成无间隙序列的示例,请参阅 SEQ1 / SEQ2 / SEQ4 / SEQ8ROW_NUMBER

此示例使用 GENERATOR 函数生成 10 行。行的内容由投影子句中的函数确定:

  • SEQ4() 列生成一个从 0 开始的 4 字节整数序列。

  • UNIFORM(...) 列根据作为第三个参数传递的函数或常量生成第一个参数 (1) 和第二个参数 (10) 之间的值。

此示例包含 RANDOM() 函数的可选“种子”,以便输出一致:

SELECT seq4(), uniform(1, 10, RANDOM(12)) 
  FROM TABLE(GENERATOR(ROWCOUNT => 10)) v 
  ORDER BY 1;
+--------+----------------------------+
| SEQ4() | UNIFORM(1, 10, RANDOM(12)) |
|--------+----------------------------|
|      0 |                          7 |
|      1 |                          2 |
|      2 |                          5 |
|      3 |                          9 |
|      4 |                          6 |
|      5 |                          9 |
|      6 |                          9 |
|      7 |                          5 |
|      8 |                          3 |
|      9 |                          8 |
+--------+----------------------------+
Copy

此示例与前面的示例类似,只不过它将常量而不是函数作为第三个参数传递给 UNIFORM 函数。结果是,每一行的 UNIFORM 列输出都是相同的。

SELECT seq4(), uniform(1, 10, 42) 
  FROM TABLE(GENERATOR(ROWCOUNT => 10)) v 
  ORDER BY 1;
+--------+--------------------+
| SEQ4() | UNIFORM(1, 10, 42) |
|--------+--------------------|
|      0 |                 10 |
|      1 |                 10 |
|      2 |                 10 |
|      3 |                 10 |
|      4 |                 10 |
|      5 |                 10 |
|      6 |                 10 |
|      7 |                 10 |
|      8 |                 10 |
|      9 |                 10 |
+--------+--------------------+
Copy

如果同时忽略 ROWCOUNTTIMELIMIT 参数,则输出为 0 行:

SELECT seq4(), uniform(1, 10, RANDOM(12)) 
  FROM TABLE(GENERATOR()) v 
  ORDER BY 1;
+--------+----------------------------+
| SEQ4() | UNIFORM(1, 10, RANDOM(12)) |
|--------+----------------------------|
+--------+----------------------------+
Copy

下面的示例使用没有 ROWCOUNT 参数的 TIMELIMIT 参数。

SELECT COUNT(seq4()) FROM TABLE(GENERATOR(TIMELIMIT => 10)) v;

+---------------+
| COUNT(SEQ4()) |
|---------------|
|    3615440896 |
+---------------+
Copy
语言: 中文