Funktioniert nicht so wie du es hast. Eine Fensterfunktion
kann man so nicht nennen. Ihre Datensatzvariable r
ist wie ein eingebauter Cursor in einem FOR
Schleife. Innerhalb der Schleife ist nur die aktuelle Zeile des Ergebnisses sichtbar. Sie müssten die Fensterfunktion SELECT
.
Aber da Sie die Zeilen sowieso in einer passenden Reihenfolge durchlaufen, können Sie es auch anders machen.
Betrachten Sie dieses weitgehend umgeschriebene Beispiel. Gibt bei der ersten verletzenden Zeile zurück:
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;
Weitere Hinweise
- Warum der Alias für
$1
? Sie haben es_day
genannt schon in der Deklaration. Bleiben Sie dran. - Stellen Sie sicher, dass Sie wissen, wie PostgreSQL mit Groß- und Kleinschreibung für Bezeichner . (Ich verwende nur Kleinbuchstaben.)
- Sie können einfach ganze Zahlen (für Tage) von einem Datum addieren/subtrahieren.