Результат запроса 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

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 деградирует. Рассмотрим более сложную технику нумерации страниц:

Используйте 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 
Другие вопросы по тегам