簡體   English   中英

PostgreSQL 如何按值查詢 jsonb?

[英]PostgreSQL how to query jsonb by a value?

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 文檔后,郁悶我沒有找到好的方法。

我可以將結果轉換成Python字典,然后使用python的方法可以輕松實現我的要求。

如果用postgresql語句也能達到要求,比Python字典更推薦哪種方法?

我不確定我是否完全理解你想要的結果。 但是如果要過濾 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'

您可以使用 PostgreSQL v12 的新 jsonpath 表示法:

SELECT data @@ '$.* ? (@.Id == "17636").Desc == "yes"'
FROM some_table;

這將從data的根 ( $ ) 開始,查找其中的任何屬性 ( * ),僅過濾包含值為"17636"Id那些屬性,獲取其Desc屬性並僅在該屬性為"yes"返回TRUE .

不錯,不是嗎?

這可能會給你你需要的東西。

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'

此致,
比亞尼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM