お使いの方法では機能しません。 ウィンドウ関数
そのように呼ぶことはできません。レコード変数r
FOR
の組み込みカーソルのようなものです ループ。結果の現在の行のみがループ内に表示されます。 ウィンドウ関数<を統合する必要があります。 code> 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が
識別子のケース 。 (私は小文字のみを使用します。) - 日付から整数(日数)を加算/減算するだけです。