【问题标题】:LIMIT and Contains in a single JSONB Query在单个 JSONB 查询中限制和包含
【发布时间】:2019-10-15 00:22:08
【问题描述】:

我有 2 个单独运行完美的查询:

这个限制了结果:

SELECT jsonb_agg(elem) as data
FROM  (
  SELECT *
  FROM file_data, jsonb_array_elements(file_data) a(elem)
  LIMIT 3
) sub;

这个正确地运行了一个“包含”过滤器:

SELECT jsonb_agg(obj)
FROM file_data, jsonb_array_elements(file_data) obj
WHERE obj->>'first_name' LIKE '%M%';

如何组合这些以便“选择名字包含 M 的数据,并将结果限制为 X 行”?

这是一个SQLFiddle,其中包含用于测试的假数据。我不确定如何继续。

【问题讨论】:

    标签: sql arrays json postgresql jsonb


    【解决方案1】:

    在聚合之前使用limit 子查询:

    select jsonb_agg(obj)
    from (
        select obj
        from file_data, jsonb_array_elements(file_data) obj
        where obj->>'first_name' LIKE '%M%'
        limit 3
     ) x ;
    

    注意:您可能希望在子查询中添加order by 子句;没有它,就无法预测 哪些 3 条记录会被选中。

    【讨论】:

    • 啊,我是如此接近。我尝试了类似的东西,但它返回了null,所以我把它扔掉了。不过,您是绝对正确的,这将与 sort 方法结合使用,以便返回的内容具有某种形式的可预测性。谢谢!
    • 欢迎@SterlingArcher!
    【解决方案2】:

    您可以根据您的subqueryrow_number() 限制您的json_agg 结果

    SELECT jsonb_agg(elem order by elem->>'id' DESC) as data
    FROM  (
      SELECT elem
        , row_number() over (order by elem->>'id') as rn
      FROM file_data
      CROSS JOIN jsonb_array_elements(file_data) a(elem)
      WHERE elem->>'first_name' LIKE '%M%'     
    ) subs 
    WHERE rn <= 3;
    

    【讨论】:

      猜你喜欢
      • 2015-01-08
      • 1970-01-01
      • 2016-12-05
      • 1970-01-01
      • 1970-01-01
      • 2018-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多