- 类别:
GENERATOR¶
根据指定的行数和/或指定的生成周期(以秒为单位)创建数据行。此系统定义的表函数支持合成行生成。
请注意,可以生成具有 0 列但可能包含许多行的虚拟表。此类虚拟表对于其 SELECT 子句完全由数据生成函数组成的查询非常有用。
语法¶
GENERATOR( ROWCOUNT => <count> [ , TIMELIMIT => <sec> ] )
GENERATOR( [ TIMELIMIT => <sec> ] )
使用说明¶
count
和sec
必须是非负整数常量。如果仅指定
ROWCOUNT
实参,则生成的表将包含count
行。如果仅指定
TIMELIMIT
实参,则查询将运行sec
秒,在该时间范围内生成尽可能多的行。确切的行数取决于系统速度,且并非完全确定。若同时指定了
ROWCOUNT
和TIMELIMIT
实参,那么:若在
TIMELIMIT
之前达到ROWCOUNT
,则生成的表将包含count
行。若在
ROWCOUNT
之前达到TIMELIMIT
,则该表将包含时间范围内生成的行数。确切的行数取决于系统速度,且并非完全确定。
如果
ROWCOUNT
或TIMELIMIT
为 NULL,则将忽略它。因此generator(ROWCOUNT => null)
生成 0 行。如果忽略两个参数(
ROWCOUNT
和TIMELIMIT
),则该 GENERATOR 函数返回 0 行。行的内容由投影子句中的函数确定,而非由 GENERATOR 函数本身确定。有关更多信息,请参阅下面的“示例”部分。另请参阅您计划在投影子句中使用的特定函数(例如 SEQ())的描述;并非所有有效函数都能生成没有间隙的序列。
示例¶
备注
这些示例生成可能存在间隙的序列。有关生成无间隙序列的示例,请参阅 SEQ1 / SEQ2 / SEQ4 / SEQ8 和 ROW_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 | +--------+----------------------------+
此示例与前面的示例类似,只不过它将常量而不是函数作为第三个参数传递给 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 | +--------+--------------------+
如果同时忽略 ROWCOUNT
和 TIMELIMIT
参数,则输出为 0 行:
SELECT seq4(), uniform(1, 10, RANDOM(12)) FROM TABLE(GENERATOR()) v ORDER BY 1; +--------+----------------------------+ | SEQ4() | UNIFORM(1, 10, RANDOM(12)) | |--------+----------------------------| +--------+----------------------------+
下面的示例使用没有 ROWCOUNT
参数的 TIMELIMIT
参数。
SELECT COUNT(seq4()) FROM TABLE(GENERATOR(TIMELIMIT => 10)) v;
+---------------+
| COUNT(SEQ4()) |
|---------------|
| 3615440896 |
+---------------+