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;
我有 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;