Postgresql - извлечение значений из json из значений [] - PullRequest
1 голос
/ 01 апреля 2020

В postgresql Я пытаюсь запросить представление, где один столбец с именем codeids имеет тип jsonb, который выглядит так - ["Code-oyg0vYNpL", "Code-m9db_s", "Code89nb"]. Я хочу запросить этот столбец с результатами, возвращаемыми по одному значению в строке. В приведенном выше примере запрос должен вернуть 3 строки.

Я выполнил запросы к полностью сформированным json BLOB-объектам, используя json_array_elements и jsonb_array_length для извлечения частей структуры json. Но кто-то с этой более простой структурой json сбивает меня с толку, так как я не могу определить правильный формат для оператора postgresql для извлечения этих трех значений. Заранее спасибо.

SELECT
  role -> 'title' AS team_role,
  jsonb_array_length(role -> 'names') AS member_count
  FROM jsonb_array_elements(value -> 'team') AS team(role)

1 Ответ

1 голос
/ 01 апреля 2020

Вы почти у цели ... но вам нужно привести фактическую таблицу (или представление) в запрос. Я обнаружил, что синтаксис LATERAL JOIN делает это более очевидным:

SELECT
    t.role -> 'title' AS team_role,
    jsonb_array_length(t.role -> 'names') AS member_count
FROM myview v
CROSS JOIN LATERAL jsonb_array_elements(v.codeids -> 'team') AS t(role)

Редактировать : если вы храните массив jsonb в столбце таблицы, это немного проще :

create table test_table (codeids jsonb);
insert into test_table(codeids) values ('["Code-oyg0vYNpL", "Code-m9db_s", "Code89nb"]');

select x.role
from test_table t
cross join lateral jsonb_array_elements(t.codeids) x(role);

| role           |
| -------------- |
| Code-oyg0vYNpL |
| Code-m9db_s    |
| Code89nb       |
...