【问题标题】:Order and limit data based on JSONB array基于 JSONB 数组的排序和限制数据
【发布时间】:2022-08-04 03:59:39
【问题描述】:

我有这样一个 PostgreSQL 表

id   data(jsonb)
--   ------------------------------------
23   {\"val\": [30, 5, 1]}
41   {\"val\": [11, 4, 99]}
99   {\"val\": [2]}

现在我想获得所有排序的 val 并限制每个查询(用于分页)。 例如 第一次查询

val
-----
1
2
4
5
11

第二次查询

val
-----
30
99

    标签: sql postgresql jsonb


    【解决方案1】:

    您需要取消嵌套数组,对结果进行排序,然后应用偏移量和限制:

    select v.value::int
    from the_table t
      cross join jsonb_array_elements_text(t.data -> 'val') as v(value)
    order by v.value::int
    offset 0 --<< start of page
    limit 5 --<< page size
    ;
    

    除了limit 5,您还可以使用符合标准的fetch first 5 rows only

    【讨论】:

      【解决方案2】:

      您可以使用 cte 转换 JSON 数据,然后在主查询中应用分页逻辑:

      with results(id, v) as ( 
          select row_number() over (order by v.value::int), v.value::int from tbl t 
          cross join jsonb_array_elements(t.data -> 'val') v
      )
      select r.v from results r where 5*(<query_num> - 1) < r.id and r.id <= 5*(<query_num> - 1) + 5
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-19
        • 1970-01-01
        • 2022-08-17
        • 1970-01-01
        • 2014-10-25
        • 1970-01-01
        • 2015-10-09
        • 2015-04-13
        相关资源
        最近更新 更多