微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

postgresql – 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;

这给我的结果是这样的:

Result

我想要{“payload:”[payload1,payload2,payload3],“rowcount”:n}.

Postgres版本10.3,有效载荷数据类型是jsonb

解决方法

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;

> Best way to get result count before LIMIT was applied

如果要处理许多行,LIMIT / OFFSET的性能会降低.考虑更复杂的分页技术:

> Optimize query with OFFSET on large table

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐