В моей базе данных PostgreSQL есть столбец JSONB под названием metadata
. Я хочу извлечь значения определенного ключа в этом столбце.
Например, рассмотрим следующую структуру JSON:
{
"key1": "value1",
"key2": [
{"key3": "value3"},
{"key3": "value4"}
]
}
Мне нужно получить значения key3
, даже если они вложены на разных уровнях (до 4 или 5 уровней). Существует ли общий подход для динамического создания SQL-запроса PostgreSQL для этой цели?
Функция jsonb_path_query() может это сделать: демо в db<>fiddle
create table your_table(
id int generated by default as identity primary key
,metadata jsonb);
insert into your_table(metadata) values
('{"key1": "value1",
"key2": [ {"key3": "value3"}
,{"key3": "value4"} ]
}')
,('{"key3": "value5",
"key2": [ {"key4": {"key3": "value6"}} ]
}');
SELECT jsonb_path_query(metadata,'strict $.**.key3')
FROM your_table
WHERE metadata @? '$.**.key3';
$
— корень структуры jsonb.**
означает, что учтены все уровни структуры.key3
возвращает значение этого ключа, найденное на любом уровнеvalue3
и value4
, которые были бы возвращены из-за двойного доступа к массиву key2
в противном случае в режиме по умолчанию lax
WHERE metadata @? '$.**.key3'
используется индекс для поиска только тех строк, в которых есть key3
Спасибо @Zegarek.
jsonb_path_query
помогает получить значения ключей. Это сработало.