【问题标题】:psql jsonb array within a array数组中的psql jsonb数组
【发布时间】:2020-06-16 22:43:02
【问题描述】:

我的数据结构就像数组中的数组。我有一个名为 id (int)、meta (JSONB) 的 2 列表,其中数据存储如下:

id : meta
12 : [... ]

[...] 如下所示:

[
  {
    "task": "T3",
    "task_label": "what is wrong.",
    "value": "Something's wrong"
  },
  {
    "task": "T0",
    "task_label": "What's wrong about this image?",
    "value": [
      {
        "x": 228.52696228027344,
        "y": 42.95765686035156,
        "tool": 0,
        "frame": 0,
        "width": 738.8717193603516,
        "height": 45.10553741455078,
        "details": [],
        "tool_label": "Sender"
      },
      {
        "x": 1302.4683837890625,
        "y": 642.2169799804688,
        "tool": 2,
        "frame": 0,
        "width": 423.1329345703125,
        "height": 115.98565673828125,
        "details": [],
        "tool_label": "Action"
      }
    ]
  }
]

我想运行 sql 查询来查找所有 tool_label where task = "T0" 的列表。

结果应该是这样的

id: meta->task->value->tool_label
12: Sender, Action 

【问题讨论】:

    标签: sql arrays json postgresql jsonb


    【解决方案1】:

    可以使用jsonb_array_elements()两次,然后过滤聚合:

    select t.id, string_agg(l2.obj ->> 'tool_label', ',') tool_labels
    from mytable t
    cross join lateral jsonb_array_elements(t.meta)            as l1(obj)
    cross join lateral jsonb_array_elements(l1.obj -> 'value') as l2(obj)
    where l1.obj ->> 'task' = 'T0'
    group by t.id
    

    【讨论】:

    • 感谢它很好用。我在这段代码中需要的唯一修改是我必须将值字段放在引号中`“value”`
    • @VinodK.Ahuja:确实,这是一个错字……已修复
    猜你喜欢
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    • 2018-05-05
    • 2019-07-02
    • 2020-04-13
    • 2022-01-22
    相关资源
    最近更新 更多