LIMIT и содержится в одном запросе JSONB - PullRequest
0 голосов
/ 15 октября 2019

У меня есть 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%';

Как мне объединить их, чтобы я мог "выбрать данные, в которых имя содержит М, и ограничить результат X строками"?

Вот SQLFiddle с поддельными данными дляпроверить это на. Я не уверен, как поступить.

Ответы [ 2 ]

1 голос
/ 15 октября 2019

Вы можете ограничить свой json_agg результат на основе row_number() вашего subquery

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;
1 голос
/ 15 октября 2019

Используйте 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 записи будут выбраны.

...