メインコンテンツまでスキップ

generate_series

generate_series

概要

startend で指定された範囲内に、オプションの step を使用して値のシリーズを生成します。

generate_series() はテーブル関数です。テーブル関数は、各入力行に対して行セットを返すことができます。行セットには、ゼロ、1つ、または複数の行が含まれることができます。各行には1つ以上の列が含まれることができます。

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 は負数でも正数でもかまいませんが、0にすることはできません。

3つのパラメーターは、同じデータ型である必要があります。例えば generate_series(INT start, INT end [, INT step]) のように指定します。

戻り値

入力パラメーター startend と同じ値のシリーズを返します。

  • step が正の場合、startend よりも大きい場合はゼロ行が返されます。逆に、step が負の場合、startend よりも小さい場合はゼロ行が返されます。
  • step が0の場合はエラーが返されます。
  • この関数は、以下のように null を扱います:入力パラメーターのいずれかがリテラルの null の場合、エラーが報告されます。入力パラメーターが式であり、式の結果が null の場合、ゼロ行が返されます(例5を参照)。

例1:範囲 [2,5] の値のシーケンスをデフォルトのステップ 1 で昇順に生成します。

MySQL > select * from TABLE(generate_series(2, 5));
+-----------------+
| generate_series |
+-----------------+
| 2 |
| 3 |
| 4 |
| 5 |
+-----------------+

例2:範囲 [2,5] の値のシーケンスを指定したステップ 2 で昇順に生成します。

MySQL > select * from TABLE(generate_series(2, 5, 2));
+-----------------+
| generate_series |
+-----------------+
| 2 |
| 4 |
+-----------------+

例3:範囲 [5,2] の値のシーケンスを指定したステップ -1 で降順に生成します。

MySQL > select * from TABLE(generate_series(5, 2, -1));
+-----------------+
| generate_series |
+-----------------+
| 5 |
| 4 |
| 3 |
| 2 |
+-----------------+

例4:step が負であり startend よりも小さい場合、ゼロ行が返されます。

MySQL > select * from TABLE(generate_series(2, 5, -1));
Empty set (0.01 sec)

例5:generate_series() の入力パラメーターとしてテーブルのカラムを使用します。この場合は、generate_series() に TABLE() を使用する必要はありません。

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 |
+-------+------+

-- ステップ1で行(1,3)および(4,7)に対して複数の行を生成します。
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 |
+-------+------+-----------------+

-- ステップ-1で行(5,2)および(9,6)に対して複数の行を生成します。
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 |
+-------+------+-----------------+

入力行 (NULL, 10) はNULL値を持っているため、この行に対してゼロ行が返されます。

キーワード

table function, generate series