2015-08-03 1 views
0

Я использую переменные сеанса 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 сбрасываются до значения, которое я инициализировал в начале запроса. Я просто не могу понять, что я делаю неправильно? По моим сведениям, это должно работать нормально.

+0

Это не будет работать. Выражение '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). –

+0

Я не вижу никакого НЕ в вашем коде? .. –

+0

@Nick: этот запрос работает идеально, когда я удаляю условие where на последней строке моего кода и сохраняю результат в временную таблицу. Значения смещения точно так, как я хочу, и я могу достичь своей цели с помощью временной таблицы, после этого запроса я выполняю current_setting, тогда он дает мне вывод как 1, который является правильным, поскольку я установил его в 1, но когда я использую этот запрос с где условие и использовать условие отрицания «<>», current_setting дает мне «0». Итак, я думаю, что логически подход shoudl работает нормально, просто я не могу понять, почему он дает проблему, когда я нажимаю условие «<>» –

ответ

0
select * from 
(
select 
    'result' 
    , case when 'q'='q' THEN 
      set_config('paging.count', '1',false) 
     WHEN current_setting('paging.count') = '1' THEN 
      '1' 
     ELSE 
      '0' END as offset 
) SUBQ 
where "offset" = '1' and 'q' <> 'q' 

не даст вам ни одной строки, и это ожидаемый результат

+0

Если вы измените условие ('q' = 'q') на (uid = 'q'), тогда строка, возвращаемая после SUBQ, должна иметь смещение как '1', а затем результат должен иметь некоторые строки, которые после «q». –

Смежные вопросы