【问题标题】:POSTGRESQL limit a resulting query given a conditionPOSTGRESQL 限制给定条件的结果查询
【发布时间】:2018-10-13 13:28:58
【问题描述】:

在 POSTGRESQL 中是否有办法在给定条件的情况下限制结果查询?

我尝试过这样的事情:

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

我需要使用它,因为根据当前时间和表中的时间,动态限制条件。

有什么想法或想法吗?

【问题讨论】:

  • 你写的应该可以。有什么问题?
  • 没有按限制订购是没有意义的。
  • @eurotrash 给我以下错误:SQL 错误 [4856] [42601] 语法错误。 LIMIT CASE WHEN extract(hour from now())=11 and replace(to_char(now(),'day'),' ','')='thursday' then 109 end
  • @joop 我有一个 order by 子句。
  • 等一下 - Vertica?那你为什么要使用 PostgreSQL 标签呢?

标签: sql postgresql case limit .when


【解决方案1】:

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

限制 { 数量 |全部}

你不能在这里使用表达式,就像你对 ORDER BY 所做的那样

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

ORDER BY sort_expression1 [ASC | DESC] [NULLS { 第一 |最后的 }] [, sort_expression2 [ASC | DESC] [NULLS { 第一 |最后 }] ...]

这里需要动态SQL,例如看PostgreSQL parameterized Order By / Limit in table function

【讨论】:

    【解决方案2】:

    你可以使用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

    【讨论】:

    • 是的,我认为这是我能做的最好的事情,即使有 CASE 声明。谢谢。
    猜你喜欢
    • 2022-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    • 2017-10-15
    • 2016-04-01
    相关资源
    最近更新 更多