При работе со строкой JSON, которая хранится в столбце таблицы БД как:
скажем, имя таблицы — t1, а имя столбца — данные:
столбец данных хранит строку json как:
[{"K":"V"}]
Ниже приведен мой запрос для получения значения на основе ключа:
select Value ->> 'Value'
from json_array_elements(select data from t1) Key
where Key->>'Key'='K';
при выполнении выдает синтаксическую ошибку.
Пробовал все возможные способы исправить это, но, наконец, нужна помощь.
---- Редактировать Вот как я получил требуемый результат -------
создать таблицу:
СОЗДАТЬ ТАБЛИЦУ t1 ( идентификатор инт, данные json );
Вставьте данные в таблицу t1:
вставить в значения t1
(1,'[{"K":"V"}]'),
(2,'[{"loadShortCut_AutoText":"both"}]'),
(3,'[{"P":"R"}]');
Ниже запрос для получения вывода:
выберите строку, строку->>'loadShortCut_AutoText' в качестве значения из t1, json_array_elements (t1.data) в виде строки ГДЕ t1.id=2;
Выход:
{"loadShortCut_AutoText":"оба"} оба
json_array_elements()
возвращает одну строку для каждого элемента массива, который также является значением JSON. Чтобы получить доступ к значению этого элемента, вам нужно использовать ->> 'K'
Оператор select
не может быть передан в качестве параметра. Вам нужно поместить исходную таблицу в предложение «main» FROM:
select e.item ->> 'K' as value
from t1
cross join json_array_elements(t1.data) as e(item)
Вы можете попробовать это:
select row->>'K' as value
from t1, json_array_elements (data) as row
WHERE row->>'K' is not null
Это вернет данные, только если ключ 'K'
существует
В качестве альтернативы вы можете использовать jsonb_path_query_array для прямого запроса массива json (требуется приведение столбца json
к jsonb
)
select
id, data,
(jsonb_path_query_array(t1.data::jsonb, '$[*]?(exists (@."K"))'::jsonpath) -> 0) #>> '{K}'::text[] AS k_value
from t1
Путь JSON $[*]?(exists (@."K"))
выбирает все элементы массива, которые содержат ключ "K"
, затем берет первый такой -> 0
и извлекает его значение #>> '{K}'::text[]
.
Преимущество этого подхода заключается в том, что он работает также для массивов JSON с повторяющимися данными (id = 4) и значениями null
(id = 6), как показано в примере вывода.
id|data |k_value|
--+-----------------------+-------+
1|[{"K":"V"}] |V |
2|[{"K":"V"},{"A":"B"}] |V |
3|[{"Z":"V"},{"A":"B"}] | |
4|[{"K":"V"},{"K":"B"}] |V |
5|[{"Z":"V"},{"K":"B"}] |B |
6|[{"Z":"V"},{"K": null}]| |
«это дает мне синтаксическую ошибку», не могли бы вы поделиться сообщением об ошибке? (в обычном тексте)