Как получить значение на основе ключа из строки JSON в PosgresSql

При работе со строкой JSON, которая хранится в столбце таблицы БД как:

скажем, имя таблицы — t1, а имя столбца — данные:

столбец данных хранит строку json как:

[{"K":"V"}]

Ниже приведен мой запрос для получения значения на основе ключа:

select Value ->> 'Value'
from json_array_elements(select data from t1) Key
where Key->>'Key'='K';

при выполнении выдает синтаксическую ошибку.

Пробовал все возможные способы исправить это, но, наконец, нужна помощь.

---- Редактировать Вот как я получил требуемый результат -------

  1. создать таблицу:

    СОЗДАТЬ ТАБЛИЦУ t1 ( идентификатор инт, данные json );

  2. Вставьте данные в таблицу t1:

вставить в значения t1

(1,'[{"K":"V"}]'),
(2,'[{"loadShortCut_AutoText":"both"}]'),
(3,'[{"P":"R"}]');
  1. Ниже запрос для получения вывода:

    выберите строку, строку->>'loadShortCut_AutoText' в качестве значения из t1, json_array_elements (t1.data) в виде строки ГДЕ t1.id=2;

  2. Выход:

    {"loadShortCut_AutoText":"оба"} оба

«это дает мне синтаксическую ошибку», не могли бы вы поделиться сообщением об ошибке? (в обычном тексте)

Frank Heikens 13.04.2023 16:15
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
1
84
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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}]|       |

Другие вопросы по теме