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

SQL関数を引数として持つPostgreSQLgenerate_series()

    あなたがしようとしていることは次のように機能する可能性があります:

    追加情報で編集

    CREATE OR REPLACE FUNCTION f_products_per_month()
      RETURNS SETOF fcholder AS
    $BODY$
    DECLARE
        r fcholder;
    BEGIN
    
    FOR r.y, r.m IN
        SELECT to_char(x, 'YYYY')::int4  -- AS y
              ,to_char(x, 'MM')::int4    -- AS m
        FROM  (SELECT '2008-01-01 0:0'::timestamp
            + (interval '1 month' * generate_series(0,57)) AS x) x
    LOOP
        RETURN QUERY
        SELECT *    -- use '*' in this case to stay in sync
        FROM   get_forecast_history(r.m, r.y);
    
        IF NOT FOUND THEN
           RETURN NEXT r;
        END IF;
    END LOOP;
    
    END;
    $BODY$
      LANGUAGE plpgsql;
    

    電話:

    SELECT * FROM f_products_per_month();
    

    主なポイント:

    • 製品がない月の空の行を含めるための最終編集。
    • 「LEFTJOIN」を作成しましたが、それが機能する方法ではありません。
    • これを行うにはいくつかの方法がありますが、 RETURN QUERY 最もエレガントです。
    • 関数get_forecast_history()が使用するのと同じリターンタイプを使用します。
    • 列名をテーブル修飾することにより、OUTパラメータとの名前の競合を回避します(最終バージョンでは適用されなくなりました)。
    • DATE '2008-01-01'は使用しないでください 、私が行ったようにタイムスタンプを使用します。とにかくto_char()に変換する必要があります。キャストが少なく、パフォーマンスが向上します(この場合はそれほど重要ではありません)。
    • '2008-01-01 0:0'::timestamp およびtimestamp '2008-01-01 0:0' 同じことを行う2つの構文バリアントです。
    • 古いバージョンのPostgreSQLの場合、言語plpgsqlはdefualtによってインストールされません。 CREATE LANGUAGE plpgsql;を発行する必要がある場合があります データベースに一度。 こちらのマニュアル をご覧ください。 。

    必要に応じて、2つの関数を1つのクエリまたは関数に単純化することもできます。




    1. mysql_num_rowsがゼロを返すのはなぜですか?

    2. OracleSQLで日付別にグループ化されたデータ

    3. CASEおよびINNERJOINでのMySQLクエリエラー

    4. MS SQLを使用してすべてのフィールドレコードで使用されている単語の個別のリストを取得するにはどうすればよいですか?