sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL generation_series() met SQL-functie als argumenten

Wat u probeert te doen, zou als volgt kunnen werken:

Bewerken met aanvullende info

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;

Bel:

SELECT * FROM f_products_per_month();

Belangrijkste punten:

  • Laatste bewerking om een ​​anders lege rij op te nemen voor maanden zonder producten.
  • Je hebt "LEFT JOIN" geschreven, maar zo kan het niet werken.
  • Er zijn verschillende manieren om dit te doen, maar RETURN QUERY is de meest elegante.
  • Gebruik hetzelfde retourtype als uw functie get_forecast_history() gebruikt.
  • Vermijd naamgevingsconflicten met de OUT-parameters door de kolomnamen te kwalificeren (niet meer van toepassing in de definitieve versie).
  • Gebruik DATE '2008-01-01' niet , gebruik een tijdstempel zoals ik deed, het moet hoe dan ook worden geconverteerd naar to_char(). Minder casten, presteert beter (niet dat het in dit geval veel uitmaakt).
  • '2008-01-01 0:0'::timestamp en timestamp '2008-01-01 0:0' zijn slechts twee syntaxisvarianten die hetzelfde doen.
  • Voor oudere versies van PostgreSQL is de taal plpgsql niet standaard geïnstalleerd. Mogelijk moet u CREATE LANGUAGE plpgsql; eenmaal in uw database. Zie de handleiding hier .

Je zou waarschijnlijk je twee functies kunnen vereenvoudigen tot één query of functie als je dat zou willen.




  1. Hoe kan ik een vervolg op Pro maken met PuPHPet?

  2. Zet tafels naast elkaar in plaats van recht naar beneden terwijl je een while-loop doet

  3. postgres:Wat doet de query 'select * from user' eigenlijk?

  4. Hoe repareert deze website de codering?