从JSON数组中选择Postgresql JSON列。

问题描述 投票:0回答:1

我在PostgreSQL的JSON列中存储了以下JSON信息

{
  "status": "Success",
  "message": "",
  "data": {
    "serverIp": "XXXX",
    "ruleId": 32321,
    "results": [
      {
        "versionId": 555555,
        "PriceID": "8abf35ec-3e0e-466b-a4e5-2af568e90eec",
        "price": 550,
        "Convert": 0.8922953080331764,
        "Cost": 10
      }
    ]
  }
}

我想在整个JSON列(名称信息)中搜索一个特定的PriceID,并通过PriceID选择整个结果元素.我如何在Postgresql JSON中做到这一点?

json postgresql
1个回答
2
投票

一个选项使用 existsjson(b)_array_elements(). 假设你的表被称为 mytable 并且jsonb列是 mycol,这将是这样的。

select t.*
from mytable t
where exists (
    select 1
    from jsonb_array_elements(t.mycol -> 'data' -> 'results') x(elt)
    where x.elt ->> 'PriceID' = '8abf35ec-3e0e-466b-a4e5-2af568e90eec'
)

在子查询中 jsonb_array_elements() unnest位于给定路径的json数组。然后,在 where 子句确保数组中至少有一个精灵具有给定的 PriceID.

如果您的数据是 json 数据类型而不是 jsonb,你需要使用 json_array_elements() 而不是 jsonb_array_elements().


如果你想显示一些来自匹配数组元素的信息,那么就不同了。你可以使用 lateral join 而不是 exists. 但请注意,如果有多个数组元素匹配,这将会重复行。

select t.*, x.elt ->> 'price' price
from mytable t
cross join lateral jsonb_array_elements(t.mycol -> 'data' -> 'results') x(elt)
where x.elt ->> 'PriceID' = '8abf35ec-3e0e-466b-a4e5-2af568e90eec'
© www.soinside.com 2019 - 2024. All rights reserved.