【问题标题】:Postgesql and JsonB: How to query list nested in an objectPostgresql 和 Json:如何查询嵌套在对象中的列表
【发布时间】:2021-04-25 01:23:39
【问题描述】:

我查看了一个又一个示例,但我找不到我需要做的语法。有下面的jsonb数据,谁能告诉我如何查询lastUpdatedTimestamp

{
    "name": "Company name",
    "professionalData": [{
            "unit": "unit 1",
            "id": "1228",
            "school": "University of California-Berkeley, Haas School of Business",
            "quarter": "Q1",
            "lastUpdatedTimestamp": "2020-10-27T18:05:00Z"
        },
        {
            "unit": "unit 2",
            "id": "1228",
            "school": "University of California-Berkeley, Haas School of Business",
            "quarter": "Q1",
            "lastUpdatedTimestamp": "2020-10-29T12:10:00Z"
        }
    ]
}

我可以获得professionalData 对象,但是我如何获得嵌套在professionalData 中的数组中的元素?这是我的确切查询:

SELECT 
    elements
FROM product_reference_master p,
    jsonb_array_elements(p.prd_ref_dta_mas_json->'professionalData') as elements

我得到一个错误:ERROR: cannot extract elements from an object

我在 AWS 中使用 Postgresql Aurora。我不确定确切的版本...

【问题讨论】:

  • 始终指定您使用的版本。
  • 谢谢,当然。我将编辑我的问题。

标签: arrays postgresql jsonb


【解决方案1】:

demos:db<>fiddle

json_array_elements()展开数组,然后就可以查询插入的字段了:

SELECT 
    elements -> 'lastUpdatedTimestamp'
FROM product_reference_master p,
    json_array_elements(p.prd_ref_json::jsonb->'professionalData') as elements

Postgres 12 开始,您也可以使用 json_path_query()

SELECT
    *
FROM product_reference_master p,
    jsonb_path_query(p.prd_ref_json, '$.**.lastUpdatedTimestamp') as elements

【讨论】:

  • 我尝试了类似的方法,但我得到了这个错误:ERROR: cannot extract elements from a scalarprofessionalData 是一个对象,而不是一个数组。相反,它包含一个数组。
  • 那么似乎有其他问题:对我来说它有效:dbfiddle.uk/… 请尝试在小提琴中重现您的设置,然后分享相关链接
  • 更新了答案
  • 我的小提琴也可以,但该示例不适用于我的数据库。我仍然收到professionalData 是标量对象的错误。 dbfiddle.uk/…
  • 也许不是所有的数据都是 JSON 类型的? stackoverflow.com/questions/50296102/… 含义:您正在将文本转换为 json。也许不是每条记录都包含预期的结构?
猜你喜欢
  • 2014-09-16
  • 1970-01-01
  • 2013-03-18
  • 1970-01-01
  • 1970-01-01
  • 2016-03-22
  • 1970-01-01
  • 2017-06-27
  • 1970-01-01
相关资源
最近更新 更多