Sie können einen Index eines gesuchten Elements finden, indem Sie jsonb_array_elements() with ordinality
verwenden (Anmerkung:ordinality
beginnt bei 1, während der erste Index des json-Arrays 0 ist):
select
pos- 1 as elem_index
from
samples,
jsonb_array_elements(sample->'result') with ordinality arr(elem, pos)
where
id = 26 and
elem->>'8410' = 'FERR_R';
elem_index
------------
2
(1 row)
Verwenden Sie die obige Abfrage, um das Element basierend auf seinem Index zu aktualisieren (beachten Sie, dass das zweite Argument von jsonb_set()
ist ein Textarray):
update
samples
set
sample =
jsonb_set(
sample,
array['result', elem_index::text, 'ratingtext'],
'"some individual text"'::jsonb,
true)
from (
select
pos- 1 as elem_index
from
samples,
jsonb_array_elements(sample->'result') with ordinality arr(elem, pos)
where
id = 26 and
elem->>'8410' = 'FERR_R'
) sub
where
id = 26;
Ergebnis:
select id, jsonb_pretty(sample)
from samples;
id | jsonb_pretty
----+--------------------------------------------------
26 | { +
| "result": [ +
| { +
| "8410": "ABNDAT", +
| "8411": "Abnahmedatum" +
| }, +
| { +
| "8410": "ABNZIT", +
| "8411": "Abnahmezeit" +
| }, +
| { +
| "8410": "FERR_R", +
| "8411": "Ferritin", +
| "ratingtext": "Some individual text"+
| } +
| ] +
| }
(1 row)
Das letzte Argument in jsonb_set()
sollte true
sein um das Hinzufügen eines neuen Werts zu erzwingen, wenn sein Schlüssel noch nicht existiert. Er kann jedoch übersprungen werden, da sein Standardwert true
ist .
Obwohl Nebenläufigkeitsprobleme unwahrscheinlich zu sein scheinen (aufgrund der restriktiven WHERE-Bedingung und einer möglicherweise geringen Anzahl betroffener Zeilen), könnten Sie auch an Atomic UPDATE .. SELECT in Postgres interessiert sein.