【问题标题】:Querying element inside a collection on a json field - Postgres在 json 字段的集合中查询元素 - Postgres
【发布时间】:2020-02-12 11:19:09
【问题描述】:

我的 Postgres 上有以下 json 结构。该表名为“customers”,包含 json 的字段名为“data”

{
  customerId: 1,
  something: "..."
  list: [{ nestedId: 1, attribute: "a" }, { nestedId: 2, attribute: "b" }]
}

我正在尝试查询所有在“list”字段中具有nestedId = 1 元素的客户。

我通过查询完成的很糟糕:

SELECT data FROM customers a, jsonb_array_elements(data->'list') e WHERE (e->'nestedId')::int = 1

我说的不好,因为我在FROM子句上使用了jsonb_array_elements,所以没有用作过滤器,导致seq扫描。

我尝试了类似的方法:

SELECT data FROM customers where data->'list' @> '{"nestedId": 1, attribute: "a"}'::jsonb

但它不返回任何东西。我想是因为“列表”字段被视为一个数组,而不是我的每种记录类型。

任何想法如何在 WHERE 条件下执行查询过滤nestedId?

【问题讨论】:

    标签: json postgresql jsonb


    【解决方案1】:

    试试这个查询:

    SELECT data FROM customers where data->'list' @> '[{"nestedId": 1}]';

    此查询将在 Postgres 9.4+ 中工作。

    【讨论】:

    • 工作就像一个魅力。非常感谢。为什么我需要把它作为一个数组元素?是因为“列表”是一个数组而不是单个对象吗?
    • @renanreismartins 是的,因为 list 是一个数组。基本上,发生的事情是,如果 RHS 数组中的每个对象都包含在 LHS 数组中的至少一个对象中,则返回 true。
    猜你喜欢
    • 2014-07-05
    • 1970-01-01
    • 2017-04-03
    • 2016-12-01
    • 2023-03-22
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多