ARRAY_AGG 集約関数

ARRAY_AGG 関数は、入力セットのそれぞれの値が配列のエレメントに割り当てられた 1 つの配列を戻します。

通常の配列集約の構文

構文図を参照するビジュアルシンタックスダイアグラムをスキップするARRAY_AGG( 式ORDER BY,ソート・キー式ASCDESC)
変更の開始

連想配列の集約の構文

構文図を参照するビジュアルシンタックスダイアグラムをスキップするARRAY_AGG( インデックス式, 式)
変更の終わり

スキーマは SYSIBM です。

通常配列の集約

expression

配列エレメントとして有効なデータ・タイプの値を戻す式を指定します。 式のデータ・タイプは、CREATE TYPE (配列) ステートメントで指定できるデータ・タイプでなければなりません。

変更の開始にはスカラー fullselect を含めることはできません。変更の終わり

ORDER BY
集合内の処理対象の、同じグループ化集合に属する行の順序を指定します。 ORDER BY 文節を指定しない場合、または ORDER BY 文節ではソート・キー値の順序を区別できない場合、同じグループ内の行は任意に順序付けられます。

変更の開始SELECT 節に ARRAY_AGG 関数の呼び出しが複数含まれている場合、ORDER BY 節を明示的に指定している同一 SELECT 節の ARRAY_AGG の呼び出しはすべて、同じ順序を指定しているか、または順序をまったく指定していないか、いずれかである必要があります。変更の終わり

ソート・キー式

列名または式のどちらかのソート・キー値を指定します。

sort-key-expression は、列マスクが定義されている列を参照してはなりません。

ソート・キー値が定数の場合、その定数は出力列の位置を参照するわけではなく、単なる定数です。これは、ソート・キーが存在しないことを意味します。

ASC
ソート・キーを昇順で処理します。 これはデフォルト・オプションです。
DESC
ソート・キーを降順で処理します。
変更の開始

連想配列の集約

インデックス式
連想配列の索引の式を指定します。

ARRAY_AGG 関数が、同じステートメントにターゲットのユーザー定義の配列データ・タイプがあるコンテキスト、または ARRAY_AGG 関数の結果がユーザー定義の配列データ・タイプに明示的にキャストされるコンテキストで呼び出される場合、index-expression のデータ・タイプはターゲットの連想配列データ・タイプの索引データ・タイプにキャスト可能でなければなりません。 そうでない場合、この式は、配列エレメントに有効なデータ・タイプの値を戻す必要があります。 式のデータ・タイプは、CREATE TYPE (配列) ステートメントで指定できるデータ・タイプでなければなりません。

連想配列の生成に使用されるグループ化セット内に、重複する index-expression 値が存在してはなりません。

expression
配列エレメントとして有効なデータ・タイプの値を戻す式を指定します。 式のデータ・タイプは、CREATE TYPE (配列) ステートメントで指定できるデータ・タイプでなければなりません。
変更の終わり

ARRAY_AGG の結果データ・タイプは、配列です。 結果配列の配列エレメントのデータ・タイプは、expression のタイプと同じです。

変更の開始ARRAY_AGG 関数は、次のコンテキストでのみ呼び出すことができます。変更の終わり

  • SELECT INTO ステートメントの SELECT リスト
  • 変更の開始スクロール可能でないカーソルの定義の最外部全選択の SELECT リスト (SQL PL のコンテキストの場合)変更の終わり
  • SET assignment-statement または SQL PL assignment-statement にソース値を提供するスカラー副照会の SELECT リスト
  • SQL スカラー関数の RETURN ステートメント

以下の制約が ARRAY_AGG に適用されます。

  • ARRAY_AGG を OLAP 指定の一部として使用することはできません。
  • ARRAY_AGG の呼び出しが含まれている全選択に ORDER BY 節を含めることはできません。
  • ARRAY_AGG の呼び出しが含まれている全選択の SELECT リストに DISTINCT キーワードを含めることはできません。
  • ARRAY_AGG の呼び出しが含まれている全選択の SELECT 節または HAVING 節に副照会を含めることはできません。
  • LOB の配列を戻す ARRAY_AGG 関数の呼び出しが含まれている SELECT 節に、GROUP BY 節も含めてはなりません。
  • 変更の開始ARRAY_AGG 関数の呼び出しが含まれている SELECT 節に、 LISTAGG 関数または XMLAGG 関数の呼び出しも含めてはなりません。変更の終わり

ARRAY_AGGの例

  • 代入文でARRAY_AGGを使用して、DECIMALARRAYの通常の配列の値を配列INTARRAYに代入します。

    SET INTARRAY = (SELECT ARRAY_AGG(VAL) FROM UNNEST(DECIMALARRAY) AS T(VAL));
  • SELECT INTO文でARRAY_AGGを使用して、ESALARIESの通常の配列の値を配列 ARRAY2 に割り当てます。

    SELECT ARRAY_AGG(T.VAL) INTO ARRAY2 FROM UNNEST(ESALARIES) AS T(VAL);
  • ARRAY_AGGを使用して、一連の電話番号を通常の配列に集約します。 その後、配列エレメントが優先順位の順に、または任意の順序で、通常配列 NUMBERS に代入されます。 ユーザー定義タイプ PHONELIST および表 EMPLOYEE が次のように定義されているとします。

    CREATE TYPE PHONELIST AS DECIMAL(10,0) ARRAY[10];
    
    CREATE TABLE EMPLOYEE ( ID INTEGER NOT NULL,
     PRIORITY INTEGER NOT NULL,
     PHONENUMBER DECIMAL(10,0),
     PRIMARY KEY(ID, PRIORITY)) ;

    以下の SQL PL プロシージャーは、従業員と連絡を取るときに使用する連絡先番号のリスト (優先順位によって順序付けされたもの) を戻す SELECT INTO ステートメントを使用します。

    CREATE PROCEDURE GETPHONENUMBERS
     (IN EMPID INTEGER,
     OUT NUMBERS PHONELIST)
     BEGIN
      SELECT ARRAY_AGG(PHONENUMBER ORDER BY PRIORITY)
       INTO NUMBERS
       FROM EMPLOYEE
      WHERE ID = EMPID;
     END

    以下の SQL PL プロシージャーは、SET assignment-statement を使用して、連絡先番号のリストを任意の順序で戻します。

    CREATE PROCEDURE GETPHONENUMBERS
     (IN EMPID INTEGER,
     OUT NUMBERS PHONELIST)
     BEGIN
      SET NUMBERS =
       (SELECT ARRAY_AGG(PHONENUMBER)
         FROM EMPLOYEE
         WHERE ID = EMPID);
     END
  • 変更の開始

    ARRAY_AGGを使用して、一連の電話番号を連想配列に集約します。 その後、配列エレメントが連想配列 EMPLOYEES に代入されます。

    ユーザー定義タイプ EMPPHONES および表 EMPLOYEE が次のように定義されているとします。

    CREATE TYPE EMPPHONES AS DECIMAL(10,0) ARRAY[INTEGER];
    
    CREATE TABLE EMPLOYEE ( ID INTEGER NOT NULL,
     PRIORITY INTEGER NOT NULL,
     PHONENUMBER DECIMAL(10,0),
     PRIMARY KEY(ID, PRIORITY)) ;

    SELECT INTO ステートメントを使用して、優先順位が 1 の電話番号を EMPLOYEE 表からの ID によって索引付けされた連想配列に集約するプロシージャーを作成します。

    
    CREATE PROCEDURE GETPHONES
    (OUT EMPLOYEES EMPPHONES)
    BEGIN
    SELECT ARRAY_AGG(ID, PHONENUMBER)
    INTO EMPLOYEES
    FROM EMPLOYEE WHERE PRIORITY=1;
    END
    変更の終わり