создание временной таблички для опытов:
DROP TABLE IF EXISTS tmp_test;
create temp table tmp_test(content_data text);
INSERT INTO tmp_test SELECT '[
{
"name": "Пачка 229",
"tiles": [
{
"code": "007",
"name": "Бензин АИ-92"
},
{
"code": "004",
"name": "Бензин АИ-95"
}
]
},
{
"name": "Пачка 230",
"tiles": [
{
"code": "009",
"name": "Бензин АИ-80"
},
{
"code": "010",
"name": "Бензин АИ-95 супер"
}
]
}
]';
Обращение по номеру работает:
postgres=# SELECT content_data::jsonb->0 FROM tmp_test;
?column?
--------------------------------------------------------------------------------------------------------------------
{"name": "Пачка 229", "tiles": [{"code": "007", "name": "Бензин АИ-92"}, {"code": "004", "name": "Бензин АИ-95"}]}
(1 row)
postgres=# SELECT content_data::jsonb->1 FROM tmp_test;
?column?
--------------------------------------------------------------------------------------------------------------------------
{"name": "Пачка 230", "tiles": [{"code": "009", "name": "Бензин АИ-80"}, {"code": "010", "name": "Бензин АИ-95 супер"}]}
(1 row)
А вот по имени ничего не выводит:
postgres=# SELECT content_data::jsonb->'name' FROM tmp_test;
?column?
----------
(1 row)
Подскажите пожалуйста как сделать чтобы содержание json вывел по имени?
тут какая-то простешая ошибка похоже..
здесь похоже что сразу идут массивы, без ключ-значение. а вот как по имени обратиться - вопрос (
Ну если нужно имя из конкретного элемента массива, то так: SELECT content_data::jsonb -> 0 ->> 'name' FROM tmp_test;
Да, так работает, спасибо 😊 А можно как-то всё вывести, где ключ-значение определенное? Например: "code": "009" При этом неизвестно в каком эллементе массива оно встретится (
select jsonb_path_query(content_data::jsonb, '$[*] ? (@.tiles[*].code == $val)', '{"val": "009"}') from tmp_test; https://www.postgresql.org/docs/current/functions-json.html
Вау! Благодарю! Попробую!
в 11-й версии не работает (
Обновить версию не вариант?
К сожалению нет.
Тогда две опции: 1. Разобрать JSON в плоскую таблицу с помощью jsonb_to_record, и дальше уже работать с нормальными таблицами 2. Уведомить начальство и ИБ, что у PG 11 в ноябре 2023 (через месяц) наступает End-of-Life, пора обновиться хотя бы на PG 15
Обсуждают сегодня