PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Sử dụng jsonb_set () để cập nhật giá trị mảng jsonb cụ thể

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. sự khác biệt giữa localhost và postgres cho máy chủ trong docker

  2. Ràng buộc duy nhất với các điều kiện trong MYSQL

  3. GroupingError:ERROR:cột phải xuất hiện trong mệnh đề GROUP BY hoặc được sử dụng trong một hàm tổng hợp

  4. Làm thế nào để tính toán đường trung bình động theo cấp số nhân trên postgres?

  5. Django + Postgres + Chuỗi thời gian lớn