sql >> Databasteknik >  >> RDS >> PostgreSQL

PostgreSQL kontrollerar en tidigare posts element


Fungerar inte som du har det. En fönsterfunktion kan inte kallas så. Din postvariabel r är som en inbyggd markör i en FOR slinga. Endast den aktuella raden av resultatet är synlig inuti slingan. Du skulle behöva integrera fönsterfunktionen lag() det till den initiala SELECT .

Men eftersom du går igenom raderna i en matchande ordning ändå, kan du göra det på ett annat sätt.

Betrakta detta till stor del omskrivna exempel. Returnerar vid den första raden som bryter mot:

CREATE OR REPLACE FUNCTION q8(_day date)
  RETURNS text AS
$BODY$
DECLARE
    r            record;
    last_enddate date;

BEGIN
FOR r IN
    SELECT *
       -- ,lag(r.endDate) OVER (ORDER BY startDate) AS last_enddate
       -- commented, because I supply an alternative solution
    FROM   periods
    ORDER  BY startDate
LOOP
    IF _day BETWEEN r.startDate AND r.endDate THEN
        RETURN 'Violates condition 1';  -- I return differing results
    ELSIF _day BETWEEN (r.startDate - 7) AND r.startDate THEN
        RETURN 'Violates condition 2';
    ELSIF _day BETWEEN last_enddate AND (r.startDate) THEN 
                                      -- removed "- 7 ", that is covered above
        RETURN 'Violates condition 3';
    END IF;

    last_enddate := r.enddate; -- remember for next iteration
END LOOP;

RETURN NULL;

END;
$BODY$ LANGUAGE plpgsql;

Fler tips

  • Varför aliaset för $1 ? Du döpte den till _day redan i deklarationen. Håll dig till det.
  • Se till att veta hur PostgreSQL hanterar case i identifierare . (Jag använder bara små bokstäver.)
  • Du kan bara lägga till/subtrahera heltal (för dagar) från ett datum.


  1. Hibernate 5 :- org.hibernate.MappingException:Okänd enhet

  2. Oracle ställer in standard NLS_LANG

  3. Hur man infogar base64-kodat img src-attribut i tabellen i Oracle och sedan visar det på sidan i Oracle apex

  4. Hur gör jag en massuppdatering i mySQL med node.js