Вы можете сделать INSERT первым оператором и проверить в подвыборе current_timestamp
.
Это использует тот факт, что current_timestamp
не продвигается во время транзакции, что означает, что значение для current_timestamp
в операторе insert
будет точно таким же, как значение, используемое в суб-выборе,
Вы также можете упростить условие «где», используя функцию max()
:
CREATE OR REPLACE FUNCTION getitems()
RETURNS SETOF items
AS $$
INSERT into LASTREAD (LASTREAD) VALUES (current_timestamp);
select *
from items
where insertdate > (select max(lastread)
from lastread
where lastread <> current_timestamp);
$$ LANGUAGE SQL;
Вышеуказанное не будет работать, если в таблице lastread
нет значений.Это можно исправить с помощью coalesce()
в функции max()
(что невозможно при подходе order by limit
:
CREATE OR REPLACE FUNCTION getitems()
RETURNS SETOF items
AS $$
INSERT into LASTREAD (LASTREAD) VALUES (current_timestamp);
select *
from items
where insertdate > (select coalesce(max(lastread), '-infinity')
from lastread
where lastread <> current_timestamp);
$$ LANGUAGE SQL;
Онлайн пример: https://rextester.com/RJA35651