カテゴリ:

テーブル関数

GENERATOR

指定された行数、指定された生成期間(秒単位)、またはその両方に基づいてデータの行を作成します。このシステム定義のテーブル関数により、合成行の生成が可能になります。

0列の仮想テーブルを生成することは可能ですが、多くの行を含む可能性があります。このような仮想テーブルは、 SELECT 句が完全にデータ生成関数で構成されるクエリに役立ちます。

構文

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

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

使用上の注意

  • count および sec は負でない整数定数でなければなりません。

  • ROWCOUNT 引数のみが指定されている場合、結果のテーブルには count 行が含まれます。

  • TIMELIMIT 引数のみが指定されている場合、クエリは sec 秒間実行され、時間枠内で可能な限り多くの行が生成されます。正確な行数はシステムの速度に依存し、完全に決定的ではありません。

  • ROWCOUNTTIMELIMIT 引数の両方が指定されている場合は、

    • TIMELIMIT の前に ROWCOUNT に到達すると、結果のテーブルには count 行が含まれます。

    • ROWCOUNT の前に TIMELIMIT に到達すると、テーブルには時間枠内に生成された行数が含まれます。正確な行数はシステムの速度に依存し、完全に決定的ではありません。

  • ROWCOUNT または TIMELIMIT がnullの場合、それらは無視されます。したがって、 generator(ROWCOUNT => null) は0行を生成します。

  • 両方のパラメーター(ROWCOUNTTIMELIMIT)が省略された場合、 GENERATOR 関数は0行を返します。

  • 行の内容は、 GENERATOR 関数自体ではなく、射影句の関数によって決定されます。詳細については、以下の例セクションをご参照ください。射影句で使用する予定の特定の関数( SEQ()など)の説明もご参照ください。 すべての有効な関数がギャップのないシーケンスを生成するわけではありません

注釈

これらの例は、ギャップを持つ可能性のあるシーケンスを生成します。ギャップのないシーケンスを生成する例については、 SEQ1 / SEQ2 / SEQ4 / SEQ8ROW_NUMBER をご参照ください。

この例では、 GENERATOR 関数を使用して10行を生成します。行の内容は、射影句の関数によって決定されます。

  • SEQ4() 列は、0で始まる4バイトの整数のシーケンスを生成します。

  • UNIFORM(...) 列は、関数または3番目のパラメーターとして渡された定数に基づいて、最初のパラメーター(1)と2番目のパラメーター(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 関数の3番目のパラメーターとして関数ではなく定数を渡すことを除いて、前述の例と似ています。その結果、 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

ROWCOUNT パラメーターと TIMELIMIT パラメーターの両方を省略すると、出力は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