psql массив jsonb в массиве - PullRequest
1 голос
/ 17 июня 2020

Моя структура данных подобна массиву внутри массива. У меня есть таблица с двумя столбцами с именем id (int), meta (JSONB), где данные хранятся, например:

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, где task = "T0".

Результат должен быть похож на

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

1 Ответ

1 голос
/ 17 июня 2020

Вы можете использовать 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
...