JSONB подмножество массива - PullRequest
1 голос
/ 18 октября 2019

В моей таблице posts есть следующее поле JSONB: comments.

comments выглядит следующим образом:

[
{"id": 1, "text": "My comment"},
{"id": 2, "text": "My other comment"},
]

Я хотел бы выбрать некоторую информацию окаждый комментарий.

SELECT comments->?????? FROM posts WHERE posts.id = 1;

Можно ли выбрать только поля id моего JSON. Например. результат моего запроса SQL должен быть:

[{"id": 1}, {"id": 2}]

Спасибо!

Ответы [ 2 ]

1 голос
/ 18 октября 2019

Вы можете использовать json_build_object + json_agg

select json_agg(json_build_object('id',j->>'id'))
from  posts cross join jsonb_array_elements(comments) as j
where (j->>'id')::int = 1;

DEMO

1 голос
/ 18 октября 2019

Вы можете использовать jsonb_to_recordset, чтобы разбить каждый комментарий на отдельную строку. Только указанные вами столбцы окажутся в строке, поэтому вы можете использовать это, чтобы сохранить только столбец id. Затем вы можете объединить комментарии для одного поста в массив, используя json_agg:

select  json_agg(c)
from    posts p
cross join lateral
        jsonb_to_recordset(comments) c(id int)  -- Only keep id
where   p.id = 1

В результате:

[{"id":1},{"id":2}]

Пример на db-fiddle.com

...