sql >> Database teknologi >  >> RDS >> PostgreSQL

PostgreSQL kontrollerer en tidligere posts element


Fungerer ikke, som du har det. En vinduefunktion kan ikke kaldes sådan. Din registreringsvariabel r er som en indbygget markør i en FOR sløjfe. Kun den aktuelle række af resultatet er synlig inde i løkken. Du skal integrere vinduefunktionen lag() det ind i den indledende SELECT .

Men da du alligevel går gennem rækkerne i en matchende rækkefølge, kan du gøre det på en anden måde.

Overvej dette stort set omskrevne eksempel. Returnerer ved den første overtrædelsesrække:

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;

Flere tip

  • Hvorfor alias for $1 ? Du gav den navnet _day allerede i erklæringen. Hold dig til det.
  • Sørg for at vide, hvordan PostgreSQL håndterer bogstaver i identifikatorer . (Jeg bruger kun små bogstaver.)
  • Du kan bare tilføje / trække heltal (for dage) fra en dato.


  1. Oracle-forespørgsel for at få første transaktions-id baseret på forbrugt udgående transaktion

  2. Valg af maks. af en sum af to kolonner

  3. Den rigtige måde at få brugernavn og adgangskode fra forbindelsesstrengen?

  4. org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter FEJL