В настоящее время я работаю с PostgreSQL 9.5 и пытаюсь обновить значение внутри массива поля jsonb. Но я не могу получить индекс выбранного значения
Моя таблица выглядит так:
CREATE TABLE samples (
id serial,
sample jsonb
);
Мой JSON выглядит так:
{"result": [
{"8410": "ABNDAT", "8411": "Abnahmedatum"},
{"8410": "ABNZIT", "8411": "Abnahmezeit"},
{"8410": "FERR_R", "8411": "Ferritin"}
]}
Моя инструкция SELECT для получения правильного значения работает:
SELECT
id, value
FROM
samples s, jsonb_array_elements(s.sample#>'{result}') r
WHERE
s.id = 26 and r->>'8410' = 'FERR_R';
приводит к:
id | value
----------------------------------------------
26 | {"8410": "FERR_R", "8411": "Ferritin"}
Хорошо, это то, что я хотел. Теперь я хочу выполнить обновление, используя следующий оператор UPDATE, чтобы добавить новый текст рейтинга элемента (если его еще нет):
UPDATE
samples s
SET
sample = jsonb_set(sample,
'{result,2,ratingtext}',
'"Some individual text"'::jsonb,
true)
WHERE
s.id = 26;
После выполнения оператора UPDATE мои данные выглядят следующим образом (тоже правильно):
{"result": [
{"8410": "ABNDAT", "8411": "Abnahmedatum"},
{"8410": "ABNZIT", "8411": "Abnahmezeit"},
{"8410": "FERR_R", "8411": "Ferritin", "ratingtext": "Some individual text"}
]}
Пока все хорошо, но я вручную поискал значение индекса 2, чтобы найти нужный элемент внутри массива JSON. Если порядок будет изменен, это не сработает.
Итак, моя проблема:
Есть ли способ получить индекс выбранного элемента массива JSON и объединить оператор SELECT и оператор UPDATE в один?
Как:
UPDATE
samples s
SET
sample = jsonb_set(sample,
'{result,' || INDEX OF ELEMENT || ',ratingtext}',
'"Some individual text"'::jsonb,
true)
WHERE
s.id = 26;
Значения samples.id и 8410 известны до подготовки оператора.
Или на данный момент это невозможно?