我在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中做到这一点?
一个选项使用 exists
和 json(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'