Я использую переменные сеанса Postgres для обработки разбиения на страницы в моем запросе.postgresql переменные сеанса сбрасываются, когда используется не условие
У меня есть табличное сообщение (id, uid, body, user_id, published_date). Я выбираю сообщения, принадлежащие данному пользователю, а затем заказываю отправленный_дайте. Теперь я должен вернуть сообщения после указанного uid в списке сообщений. Для этого я использую переменные сессии,
select set_config('paging.count', '0',false)
SELECT *
FROM
(SELECT
m2.uid, m2.id,
case when uid = 'XYZ' THEN
set_config('paging.count', '1',false)
WHEN current_setting('paging.count') = '1' THEN
'1'
ELSE
'0' END as offset
FROM
(SELECT m1.*,mu.* FROM schema_1.message m1
WHERE m1.user_id = 1 AND m1.id IN (4078,4076,4080,4031,4055,4056,4057,3596,4193,4467,4389,4285,4338,)
ORDER BY posted_date) m2 ) m
WHERE m.offset = '1' and m.uid <> 'XYZ'
Здесь я инициализировать переменную сеанса 1, когда данный UID выбран в запросе, все сообщения, после того, что идентификатор будет компенсировано как 1 и, таким образом, я буду получать все сообщения после данного сообщения, добавив условие для смещения. Но этот запрос работает отлично только тогда, когда я не использую последнее условие NOT. Но как только я применяю условие NOT, мои переменные сеанса типа get сбрасываются до значения, которое я инициализировал в начале запроса. Я просто не могу понять, что я делаю неправильно? По моим сведениям, это должно работать нормально.
Это не будет работать. Выражение 'SELECT' не является циклом' for'. Postgres может и будет перенастраивать ваш запрос по своему усмотрению. В частности, поскольку 'current_setting' является [' STABLE'] (http://www.postgresql.org/docs/9.4/static/xfunc-volatility.html), его можно оценивать только один раз за запрос. Вы должны попробовать [другой подход] (https://wiki.postgresql.org/images/3/35/Pagination_Done_the_PostgreSQL_Way.pdf). –
Я не вижу никакого НЕ в вашем коде? .. –
@Nick: этот запрос работает идеально, когда я удаляю условие where на последней строке моего кода и сохраняю результат в временную таблицу. Значения смещения точно так, как я хочу, и я могу достичь своей цели с помощью временной таблицы, после этого запроса я выполняю current_setting, тогда он дает мне вывод как 1, который является правильным, поскольку я установил его в 1, но когда я использую этот запрос с где условие и использовать условие отрицания «<>», current_setting дает мне «0». Итак, я думаю, что логически подход shoudl работает нормально, просто я не могу понять, почему он дает проблему, когда я нажимаю условие «<>» –