sql >> Databasteknik >  >> RDS >> PostgreSQL

PostgreSQL gener_series() med SQL-funktion som argument

Det du försöker kan fungera så här:

Redigera med ytterligare information

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;

Ring:

SELECT * FROM f_products_per_month();

Huvudpunkter:

  • Slutlig redigering för att inkludera en annars tom rad i månader utan produkter.
  • Du skrev "LEFT JOIN", men det är inte så det kan fungera.
  • Det finns flera sätt att göra detta, men RETURN QUERY är den mest eleganta.
  • Använd samma returtyp som din funktion get_forecast_history() använder.
  • Undvik namnkonflikter med OUT-parametrarna genom att tabellkvalificera kolumnnamnen (inte längre tillämpligt i den slutliga versionen).
  • Använd inte DATE '2008-01-01' , använd en tidsstämpel som jag gjorde, den måste ändå konverteras till to_char(). Mindre casting, presterar bättre (inte för att det spelar så stor roll i det här fallet).
  • '2008-01-01 0:0'::tidsstämpel och tidsstämpel '2008-01-01 0:0' är bara två syntaxvarianter som gör samma sak.
  • För äldre versioner av PostgreSQL är språket plpgsql inte installerat som standard. Du kan behöva utfärda CREATE LANGUAGE plpgsql; en gång i din databas. Se handboken här .

Du kan förmodligen förenkla dina två funktioner till en fråga eller funktion om du vill.




  1. Så här använder du Summa, Avg och Count i Select Statement - SQL Server / TSQL Tutorial Del 128

  2. Kör uppskjuten trigger endast en gång per rad i PostgreSQL

  3. Skillnaden mellan IS NOT NULL och NOT (fält =NULL) i dessa 2 frågor

  4. Gettext eller databasöversättning