sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL die het element van een vorig record controleert


Werkt niet zoals jij het hebt. Een vensterfunctie kan niet zo genoemd worden. Uw recordvariabele r is als een ingebouwde cursor in een FOR lus. Alleen de huidige rij van het resultaat is zichtbaar in de lus. Je zou de vensterfunctie lag() het in de eerste SELECT .

Maar aangezien je de rijen toch in een overeenkomende volgorde doorloopt, kun je het op een andere manier doen.

Beschouw dit grotendeels herschreven voorbeeld. Retourneert bij de eerste in strijd zijnde rij:

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;

Meer hints

  • Waarom de alias voor $1 ? Je noemde het _day al in de aangifte. Houd je eraan.
  • Zorg ervoor dat u weet hoe PostgreSQL omgaat met case in identifiers . (Ik gebruik alleen kleine letters.)
  • Je kunt gewoon gehele getallen (voor dagen) van een datum optellen/aftrekken.


  1. Gebruiker kan geen databases zien in mysql workbench

  2. Hoe tekst uit meerdere rijen samen te voegen tot een enkele tekenreeks op de Oracle-server?

  3. Geen gegevens geëxtraheerd uit MySQL-database tijdens het uitvoeren van mijn JSP-pagina

  4. Beste manier om het TEXT-veld uniek te houden in de MySQL-database