objects типа json [{"tag": "x"}, {"tag": "y"}, {"tag": "z"}]
как я могу из этого поля вытянуть все tag в отдельный массив, собрать с каждого объекта, чтоб полчился в итоге следущий результат селекта ["x", "y", "z"] ? так можно сделать?
jsonb же?
Нет, тип в БД у этого поля просто json
json_field::json#>'{tag}'
но по моему это не классический json объект На верхнем уровне у json должен быть тип map[string]interface
с чего вы взяли?
Сейчас попробую, спасибо
Ну ок Есть два типа []json и json_object
мы что будем это обсуждать) ? Или все таки предложите решение?
да будем, поскольку это чушь.
что то не сработало, select вернул null. а pgadmin подсказывает что поле действительно типа json: https://i.imgur.com/ecFnB9t.png
https://datatracker.ietf.org/doc/html/rfc8259
https://postgrespro.ru/docs/postgresql/9.6/functions-json
ну ок но в спецификации явно указано деление begin-array и begin-object и подходы для их разбора разные
create table temp.data ( id bigserial, json_field json ); insert into temp.data (json_field) values ('[{"tag": "x"}, {"tag": "y"}, {"tag": "z"}]'), ('[{"tag": "x"}, {"tag": "y"}]'); select id , json_agg(tag_value) as json_new_field from ( select id , json_array_elements(json_field) ->> 'tag' as tag_value from temp.data ) s group by id сложновато, конечно
ну логично блин, что array начинается с квадратной скобки, а object с фигурной. важно вот это: JSON-text = ws value ws value = false / null / true / object / array / number / string
спасибо, сложновато, но работает как раз как нужно) думал как то попроще можно, но что то похоже нет)
Обсуждают сегодня