Bạn có thể tìm chỉ mục của một phần tử được tìm kiếm bằng cách sử dụng jsonb_array_elements() with ordinality
(lưu ý, ordinality
bắt đầu từ 1 trong khi chỉ mục đầu tiên của mảng json là 0):
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)
Sử dụng truy vấn trên để cập nhật phần tử dựa trên chỉ mục của nó (lưu ý rằng đối số thứ hai của jsonb_set()
là một mảng văn bản):
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;
Kết quả:
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)
Đối số cuối cùng trong jsonb_set()
phải là true
để buộc thêm một giá trị mới nếu khóa của nó chưa tồn tại. Tuy nhiên, nó có thể bị bỏ qua vì giá trị mặc định của nó là true
.
Mặc dù các vấn đề về đồng thời dường như khó xảy ra (do điều kiện WHERE hạn chế và có thể có một số lượng nhỏ các hàng bị ảnh hưởng), bạn cũng có thể quan tâm đến Atomic UPDATE .. SELECT trong Postgres.