【问题标题】:Postgres query result to json objectPostgres 查询结果到 json 对象
【发布时间】:2018-09-17 16:19:47
【问题描述】:

我的查询如下

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.3payload数据类型为jsonb

【问题讨论】:

  • 请将数据发布为文本,切勿以图片形式发布。始终声明您的 Postgres 版本和表定义。最重要的是payload的数据类型,可以为null吗?并用简单的英语解释查询的目的。
  • 感谢指导,Postgres 10.3版本,payload数据类型为jsonb
  • 因为它将成为一个有效负载列表,因为我想为我的查询添加一个限制,因为我想做分页。所以我也需要计数,所以带有有效负载和计数列表的 json 对象

标签: postgresql pagination aggregate-functions jsonb sql-limit


【解决方案1】:

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 对象和另一个变量,该变量将说明在应用限制和偏移量时将返回多少行查询,因此我可以按行数进行分页。通过使用您的查询,我得到的结果与我在问题中提到的结果相同,它只给了我一个 JSON 对象
  • @user75904:为您更新的问题考虑更新的解决方案。请编辑问题以包含来自您的 cmets 的信息。
  • @pravinbhogil:如果这回答了你的问题,请考虑接受它。
【解决方案2】:

使用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 

【讨论】:

  • 感谢您的回复,但正如我所说的那样,这并不能解决我的问题。由于您的查询执行相同的操作,但与我的查询不同的是,它不是 rowcount 的新列,而是返回相同的对象,例如 {"payload":"","rowcount":"","payload":"",rowcount :n} 我正在寻找一个数组中的所有有效负载并计入另一个变量,例如 {paload:[payload 1,payload2,payload3],"rowcaount":n}
猜你喜欢
  • 1970-01-01
  • 2020-03-26
  • 1970-01-01
  • 2017-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-21
相关资源
最近更新 更多