SELECT * FROM some_table;
我可以查询以获得以下结果:
{
"sku0": {
"Id": "18418",
"Desc": "yes"
},
"sku1": {
"Id": "17636",
"Desc": "no"
},
"sku2": {
"Id": "206714",
"Desc": "yes"
},
"brand": "abc",
"displayName": "something"
}
首先,skus的数量不固定。可能是sku0,sku1,sku2,sku3,sku4 ...,但它们都以sku
开头。
然后,我想用 17636 查询ID,并确定其 Desc 的值是“是”或“否”。读完PostgreSQL JSON Functions and Operators documentation之后,令人沮丧的我没有找到好方法。
我可以将结果转换为Python字典,然后使用python的方法可以轻松满足我的要求。
如果也可以通过postgresql语句实现要求,那么比Python字典更推荐哪种方法?
答案 0 :(得分:1)
我不确定我是否完全了解您想要的结果。但是,如果要过滤ID,则需要取消嵌套JSON列中的所有元素:
select d.v ->> 'Desc' as description
from the_table t
cross join jsonb_each(t.data) as d(k,v)
where d.v ->> 'Id' = '17636'
答案 1 :(得分:0)
这可能会给您您所需要的。
select value->>'Desc' from jsonb_each('{
"sku0": {
"Id": "18418",
"Desc": "yes"
},
"sku1": {
"Id": "17636",
"Desc": "no"
},
"sku2": {
"Id": "206714",
"Desc": "yes"
},
"brand": "abc",
"displayName": "something"
}'::jsonb)
where key like 'sku%'
and value->>'Id'='17636'
最好的问候,
比尼亚尼
答案 2 :(得分:0)
您可以使用PostgreSQL v12的新jsonpath表示法:
start-job -name Job1 -ScriptBlock {[MyProgram.Program]::Main()}
这将从SELECT data @@ '$.* ? (@.Id == "17636").Desc == "yes"'
FROM some_table;
(data
)的根开始,在其中找到任何属性($
),仅过滤包含{ *
,获取其Id
属性,并仅在该属性为"17636"
时返回Desc
。
很好,不是吗?