PostgreSQL如何通过值查询jsonb?

时间:2019-12-16 16:47:15

标签: sql postgresql

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字典更推荐哪种方法?

3 个答案:

答案 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

很好,不是吗?