LIMIT 和包含在单个 JSONB 查询中

LIMIT and Contains in a single JSONB Query

我有 2 个查询分别 运行 完美:

这个限制了结果:

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

这个正确 运行 是一个 'contains' 过滤器:

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

我该如何组合这些才能"select data where the first name contains M, and limit the result to X rows"?

这里有一个 SQLFiddle 假数据来测试它。我不确定如何进行。

在聚合之前使用 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条记录会被选中。

您可以根据 subquery

row_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;