Не работи така, както го имате. прозоречна функция
не може да се нарече така. Вашата променлива за запис r
е като вграден курсор в FOR
цикъл. Вътре в цикъла се вижда само текущият ред на резултата. Ще трябва да интегрирате прозоречната функция lag()
го в началния SELECT
.
Но тъй като така или иначе преминавате през редовете в съвпадащ ред, можете да го направите по друг начин.
Помислете за този до голяма степен пренаписан пример. Връща при първия нарушаващ ред:
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;
Още съвети
- Защо псевдонимът за
$1
? Нарекохте го_day
вече в декларацията. Придържайте се към него. - Не забравяйте да знаете как PostgreSQL обработва регистр в идентификаторите . (Използвам само малки букви.)
- Можете просто да добавяте/изваждате цели числа (за дни) от дадена дата.