POSTGRESQL ограничить результирующий запрос с учетом условия - PullRequest
0 голосов
/ 03 мая 2018

Есть ли в POSTGRESQL способ ограничить результирующий запрос заданным условием?

Я пробовал что-то вроде этого:

SELECT * 
FROM table 
LIMIT CASE 
       WHEN extract(hour from now())=9 then 143
       WHEN extract(hour from now())=10 then 178 ETC.`

Мне нужно использовать это, потому что в зависимости от текущего часа и часа в таблице, динамически ограничивать условием.

Есть мысли или идеи?

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Вы можете использовать row_number():

SELECT t.* 
FROM (SELECT t.*, ROW_NUMBER() OVER (ORDER BY ?) as seqnum
      FROM table t
     ) t
WHERE (extract(hour from now()) = 9 AND seqnum <= 143) OR
      (extract(hour from now()) = 10 AND seqnum <= 178) OR
      . . . 

Более вероятным решением было бы справиться с этим на прикладном уровне.

Обратите внимание на ?: этот столбец используется для упорядочения данных. Обычно при использовании LIMIT вы хотите ORDER BY.

0 голосов
/ 03 мая 2018

https://www.postgresql.org/docs/current/static/queries-limit.html

LIMIT {число | ВСЕ}

Вы не можете использовать выражение здесь, как вы делаете с ORDER BY

https://www.postgresql.org/docs/current/static/queries-order.html

ORDER BY sort_expression1 [ASC | DESC] [NULLS {FIRST | ПРОШЛОЙ }] [, sort_expression2 [ASC | DESC] [NULLS {FIRST | ПОСЛЕДНИЕ}] ...]

здесь вам нужен динамический SQL, например, посмотрите на Параметризация PostgreSQL Order By / Limit в табличной функции

...