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

リターンタイプをSETOFテーブルと追加フィールドにする簡単な方法はありますか?

    あなたはできた 行全体を複合型として返し、さらにいくつか追加します:

    CREATE OR REPLACE FUNCTION f_rowplus()
      RETURNS TABLE (rec demo, add_int int, add_txt text) AS
    $func$
    SELECT d, 5, 'baz'::text FROM demo d;
    $func$  LANGUAGE sql;
    

    ただし、単純な呼び出しを使用する場合:

    SELECT * FROM f_rowplus();
    

    テーブルdemoから行を取得します 個別の複合タイプとして。電話する必要があります:

    SELECT (rec).*,  add_int, add_txt FROM f_rowplus();
    

    すべての個人を取得するには 列。かっこが必要です。

    Postgresはここでは少し一貫性がありません。次のコマンドで関数を作成する場合:

    CREATE OR REPLACE FUNCTION f_row2()
      RETURNS TABLE (rec demo) AS
    ...
    

    次に、複合型demo サイレントに個々の列に変換されます(分解されます)。元の複合タイプへのリンクは残りません。宣言された出力列recを参照することはできません まったく、それは分解されたタイプの列に置き換えられているので。この呼び出しにより、エラーメッセージが表示されます:

    SELECT rec FROM f_row2();

    ここでも同じ:

    CREATE OR REPLACE FUNCTION f_row3(OUT rec demo)
      RETURNS SETOF demo AS
    ...
    

    ただし anyを追加するとすぐに もっとOUT 列の場合、複合型は宣言されたとおりに保持され(分解されません)、次のことができます。

    SELECT rec FROM f_rowplus();
    

    最初の機能で。

    SQLフィドルを作成しました バリアントのデモンストレーション。


    FROMで複数の列を返す関数を使用する場合 リスト(テーブル関数として)およびSELECTでの分解 このようなリスト:

    SELECT (rec).* FROM f_rowplus();
    

    ...関数は引き続き1回評価されます のみ-およびの呼び出し中 SELECTで分解する このように直接リストします:

    SELECT (f_rowplus()).*;  -- also: different result
    

    ...すべての列に1回評価します リターンタイプで。詳細:




    1. 1899-12-30が12/31ではなくAccess/SQL Serverのゼロ日付であるのはなぜですか?

    2. UnicodeEncodeError:'latin-1'コーデックは文字をエンコードできません

    3. MySQL高可用性フレームワークの説明–パートIII:障害シナリオ

    4. PostgreSQLのYYYY-MM列タイプ