【问题标题】:PostgreSQL - selecting JSON rows that have an array with a given elementPostgreSQL - 选择具有给定元素的数组的 JSON 行
【发布时间】:2019-03-04 09:55:18
【问题描述】:

我有一个名为 data_audit 的 PostgreSQL 表,其中有一列名为 body,其类型为 json。每行包含一个具有以下结构的值:

{
  "target": {
    "ids": [
      "ID1",
      "ID2"
    ]
  }
}

(我已经删除了很多不相关的字段。)

我想选择 ids 数组(可能包含 0、1 或更多字符串)包含特定值的所有行。

我尝试了::jsonb[]ANY()@>json_array_elements_text() 等的各种组合,但无济于事。

运行此查询最简单、最有效的方法是什么?

此表尚未投入生产,因此如果字段是另一种类型 (jsonb?) 会更容易/更高效,这可能是一种选择。

我正在运行 PostgreSQL 10.3。

谢谢!

【问题讨论】:

    标签: arrays json postgresql


    【解决方案1】:

    这是查询所需内容的一种适当方式。

    select * FROM data_audit cross join lateral 
    json_array_elements_text (body->'target'->'ids')  as j(id)
    where j.id ='ID1';
    

    Demo

    【讨论】:

    • 谢谢。该查询的性能会像看起来那样可怕吗?
    • @rweiser:不多。但是,如果您真的担心性能,您可以通过将这些值存储在不同的表/列中来规范化您的表,或者在经常获取的 json 属性上创建一个索引。见this example
    • cross join lateral 对我有什么好处?如果我只是查询... FROM data_audit, json_array_elements_text...,它似乎也能正常工作。
    • @rweiser : Nothing.. CROSS JOIN 是 ANSI-92 语法,更冗长。隐式逗号语法 a,b 已过时,最好避免使用 stackoverflow.com/a/3918601/7998591
    猜你喜欢
    • 1970-01-01
    • 2021-12-20
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多