如何在 postgresql 中加入从 Json_array_elements 返回的值?

Posted

技术标签:

【中文标题】如何在 postgresql 中加入从 Json_array_elements 返回的值?【英文标题】:how to join on the values returned from Json_array_elements in postgresql? 【发布时间】:2018-04-11 05:06:23 【问题描述】:

“订单”表的结构:

objectId text, 
subOrders jsonb

jsonb结构:jsonb对象数组。例如。

[
   
      "className":"SubOrder",
      "__type":"Pointer",
      "objectId":"tIENf1PCHO"
   ,
   
      "className":"SubOrder",
      "__type":"Pointer",
      "objectId":"yKVDFEuWx7"
   
]

“子订单”表的结构:

objectId text,
orderitems jsonb

suborder.orderitems jsonb的结构,例如:

[
   
      "className":"SubOrderItem",
      "__type":"Pointer",
      "objectId":"6d1DLrmOTD"
   ,
   
      "className":"SubOrderItem",
      "__type":"Pointer",
      "objectId":"xK6mR2PDDU"
   
]

我需要加入Order.suborders.objectIdsuborder.objectid

AS Order.suborders 列是一个jsonb对象数组,我取数组元素如下。

select jsonb_array_elements("subOrders")->>'objectId' 
from "Order"

然后就是将返回的objectId与Suborder表连接起来的问题。

【问题讨论】:

@a_horse_with_no_name 感谢您编辑问题。请帮忙。 【参考方案1】:

将函数调用放入FROM子句中,稍后取消引用JSON对象的实际字段。

select o.object_id, so.*
from "Order" o
  cross join lateral jsonb_array_elements(sub_orders) j(suborder)
  join sub_order so on so.object_id = j.suborder ->> 'objectId' 

在线示例:http://rextester.com/GQBF88668

【讨论】:

我的查询是这样的select o.*, j.*, ot.* from "Order" o cross joinlateral select jsonb_array_elements("subOrders")->>'objectId' as j(object_id)从“订单”加入“子订单”ot on ot。“objectId”=j.object_id;我的错误是“->>”第 3 行或附近的语法错误:...oss joinlateral jsonb_array_elements("subOrders")->>'object... 请帮助 我所有的 objectid 都只是文本字段。 select o.*, j.*, ot.* from "Order" o cross joinlateral jsonb_array_elements(o."subOrders")->>'objectId' as j("object_id") join “SubOrder” ot on ot.“objectId” = j.“object_id”;... 抱歉,一个不正确。即使这样也有同样的错误。' 用所涉及的表的结构和要求编辑了我的问题。谢谢。 完成。非常感谢。【参考方案2】:

我会使用WITH Queries

WITH suborders_object AS(
select jsonb_array_elements("subOrders")->>'objectId' AS obid from Order
)
SELECT * FROM suborders_object JOIN Order ON (suborders_object.obid = Order.id);

或您喜欢的任何方式将 suborders_object 像表格一样加入。

【讨论】:

非常感谢 Ashraful。你也可以分享其他方法,比如加入其他表格吗? PostgreSql : Json Array to Rows using Lateral Join 怎么样?

以上是关于如何在 postgresql 中加入从 Json_array_elements 返回的值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在一个实体类中放入从多个sql语句中查询的数据

UITableViewCell 如何知道从数组或字典中加载啥 JSON

PostgreSQL - 将行转换为 JSON 键/值对

SQLAlchemy PostgreSQL row_to_json关系

如何在 postgresql 中对 json 类型使用唯一约束

使用舍入从浮点数转换为 uint8_t