Результат запроса postgres к объекту json

Мой запрос приведен ниже

SELECT w.payload,
       Count('payload') OVER () AS ROWCOUNT
FROM wholesale_confirmation.wholesale_order_confirmation w
WHERE w.delivery_date = COALESCE(NULL, w.delivery_date)
  AND w.ship_to_location_id = COALESCE(NULL, w.ship_to_location_id)
  AND w.order_raised_date = COALESCE(NULL, w.order_raised_date)
  AND w.ship_from_location_id = COALESCE(NULL, w.ship_from_location_id)
LIMIT 10
OFFSET 0;

что дает мне такой результат:

Результат

Хочу вместо {"payload:"[payload1,payload2,payload3],"rowcount":n}.


Postgres версии 10.3, payload тип данных jsonb


person pravinbhogil    schedule 07.04.2018    source источник
comment
Пожалуйста, публикуйте данные как текст, а не как изображение. Всегда объявляйте свою версию Postgres и определение таблицы. Самое главное, тип данных payload и может ли он быть нулевым? И объясните цель запроса простым английским языком.   -  person Erwin Brandstetter    schedule 08.04.2018
comment
Спасибо за руководство, Postgres версии 10.3, тип данных полезной нагрузки - jsonb   -  person pravinbhogil    schedule 08.04.2018
comment
Поскольку это будет список полезной нагрузки, так как я добавляю ограничение на свой запрос, потому что я хочу выполнить разбиение на страницы. поэтому мне также нужно подсчитать, поэтому объект json со списком полезной нагрузки и подсчетом   -  person pravinbhogil    schedule 08.04.2018


Ответы (2)


COALESCE(NULL, w.delivery_date) сводится к просто w.delivery_date.

Следовательно, WHERE w.delivery_date = COALESCE(NULL, w.delivery_date) сводится к WHERE w.delivery_date IS NOT NULL.

Count('payload') OVER () AS ROWCOUNT - это просто шумный способ сказать count(*) OVER () AS rowcount и возвращает общее количество строк результата.

Ваш текущий запрос, упрощенный:

SELECT payload, count(*) OVER () AS rowcount
FROM   wholesale_confirmation.wholesale_order_confirmation
WHERE  delivery_date          IS NOT NULL
AND    ship_to_location_id    IS NOT NULL
AND    order_raised_date      IS NOT NULL
AND    ship_from_location_id  IS NOT NULL
LIMIT  10;

Чтобы получить объект JSON, как в обновленном вопросе, содержащий один массив объектов JSON и общее количество строк:

SELECT json_build_object('payload', jsonb_agg(payload), 'rowcount', min(rowcount))
FROM  (
   SELECT payload, count(*) OVER () AS rowcount
   FROM   wholesale_confirmation.wholesale_order_confirmation
   WHERE  delivery_date          IS NOT NULL
   AND    ship_to_location_id    IS NOT NULL
   AND    order_raised_date      IS NOT NULL
   AND    ship_from_location_id  IS NOT NULL
   LIMIT  10
   ) sub;

Если вы имеете дело с большим количеством строк, производительность с LIMIT / OFFSET снижается. Рассмотрим более сложную технику разбивки на страницы:

person Erwin Brandstetter    schedule 08.04.2018
comment
Спасибо за ответ ..! но, как упоминалось в вопросе, мне нужен один объект JSON с массивом полезной нагрузки и другая переменная, в которой будет указано, сколько строк будет возвращено при применении ограничения и смещения, чтобы я мог выполнять разбиение на страницы по количеству строк. Используя ваш запрос, я получаю тот же результат, который я упоминал в вопросе, он просто дает мне один объект JSON - person pravinbhogil; 08.04.2018
comment
@ user75904: Рассмотрите обновленное решение для вашего обновленного вопроса. Измените вопрос, включив в него информацию из ваших комментариев. - person Erwin Brandstetter; 08.04.2018
comment
@pravinbhogil: Если это ответ на ваш вопрос, примите его. - person Erwin Brandstetter; 14.04.2018
comment
@pravinbhogil: Как работает принятие ответа? - person Erwin Brandstetter; 17.05.2018

Используйте json_build_object:

WITH foobar AS ( 
SELECT w.payload,
       Count('payload') OVER () AS ROWCOUNT
FROM wholesale_confirmation.wholesale_order_confirmation w
WHERE w.delivery_date = COALESCE(NULL, w.delivery_date)
  AND w.ship_to_location_id = COALESCE(NULL, w.ship_to_location_id)
  AND w.order_raised_date = COALESCE(NULL, w.order_raised_date)
  AND w.ship_from_location_id = COALESCE(NULL, w.ship_from_location_id)
LIMIT 10
OFFSET 0
)

SELECT 
    json_build_object('payload', payload, 'rowcount', rowcount)
FROM 
    foobar 
person Michel Milezzi    schedule 08.04.2018
comment
Спасибо за ответ, но, как я уже сказал, это не решает мою проблему. Поскольку ваш запрос делает то же самое, что и мой, вместо нового столбца для rowcount, он возвращает тот же объект, например {payload:, rowcount:, payload:, rowcount: n}, что я ищу для всей полезной нагрузки в одном массив и подсчитайте в другой переменной, например {paload: [payload 1, payload2, payload3], rowcaount: n} - person pravinbhogil; 08.04.2018