PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

PostgreSQL проверява елемент на предишен запис


Не работи така, както го имате. прозоречна функция не може да се нарече така. Вашата променлива за запис 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 обработва регистр в идентификаторите . (Използвам само малки букви.)
  • Можете просто да добавяте/изваждате цели числа (за дни) от дадена дата.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Не е избрана схема за създаване в ... грешка

  2. Как да нулирате последователността на първичния ключ на postgres, когато не е синхронизирана?

  3. Pg_dump и pg_restore на Postgresql в различни основни версии?

  4. Как да проверите вашата PostgreSQL версия

  5. Rails + PostgreSQL - Използване на Like