sql >> データベース >  >> RDS >> PostgreSQL

array_agg()を使用した関数の戻り値タイプ

    関数は戻り型を宣言する必要があります。配列は、よく知られている要素タイプにのみ基づくことができます。匿名の記録は許可されていません。したがって、ニーズに合った複合型を作成します(行型をすでに定義しているテーブルまたはビューがない場合)。

    CREATE TYPE my_type (
      ts          text
    , alertlevel  int
    , time_passed interval
    );
    

    テストの目的で、セッション中に複合型を登録するための一時テーブルを作成することもできます。

    CREATE TEMP TABLE my_type ( ...)
    

    (セッションの終了時に一時テーブルが削除され、その型に基づいて構築された関数はその後壊れます。)

    それを配列の基本型として使用します。目的のために単純なSQL関数を使用できます:

    CREATE OR REPLACE FUNCTION foo()
      RETURNS my_type[] AS
    $func$
    SELECT array_agg(result::my_type)  -- you must cast the row type!
    FROM  (
       SELECT to_char("Timestamp", 'YYYY-MM-DD HH24:MI:SS')
            , "AlertLevel"
            , "Timestamp" - lag("Timestamp") OVER (ORDER BY "Timestamp")
       FROM   "Judgements"
       WHERE  "SampleID" = sampleid
       AND    "Timestamp" >= starttime
       AND    "Timestamp" <= stoptime
       ) result
    WHERE "AlertLevel" > 0;
    $func$
    LANGUAGE sql;
    

    電話:

    SELECT foo();
    

    text []を使用した単純な代替手段

    textにキャストすることもできます /テキスト[] 。列名とタイプ情報は失われますが、そのままで機能します:

    CREATE OR REPLACE FUNCTION foo()
      RETURNS text[] AS
    $func$
    SELECT array_agg(result::text)  -- cast the record to text!
    FROM  ( ... ) result
    ...;
    $func$
    LANGUAGE sql;
    

    実際に配列が必要ない場合は、 array_agg()を廃棄できます。 、個々の行を返し、 RETURNS TABLE(...)を使用して戻りタイプを宣言します。 。 SOでplpgsql を検索します タグ、あなたは多くの例を見つけるでしょう..

    次のコマンドで集合を返す関数を呼び出すことを忘れないでください:

    SELECT * FROM foo();
    



    1. SQLでvarchar列を複数の値として分割するにはどうすればよいですか?

    2. 特定のサイズを作成する

    3. 2つのテーブル間のOracleSQLチェック制約

    4. SQLクエリ結果の別のテーブルから複数の変数を置き換えます