sql >> Database teknologi >  >> RDS >> PostgreSQL

Brug af jsonb_set() til at opdatere specifik jsonb-arrayværdi

Du kan finde et indeks over et søgt element ved hjælp af jsonb_array_elements() with ordinality (bemærk, ordinality starter fra 1, mens det første indeks for json-arrayet er 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) 

Brug ovenstående forespørgsel til at opdatere elementet baseret på dets indeks (bemærk, at det andet argument for jsonb_set() er et tekstarray):

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;    

Resultat:

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)

Det sidste argument i jsonb_set() skal være true for at tvinge tilføjelse af en ny værdi, hvis dens nøgle ikke eksisterer endnu. Den kan dog springes over, da dens standardværdi er true .

Selvom problemer med samtidighed ser ud til at være usandsynlige (på grund af den restriktive WHERE-tilstand og et potentielt lille antal berørte rækker), er du muligvis også interesseret i Atomic UPDATE .. SELECT i Postgres.




  1. Returner kun numeriske værdier i MariaDB

  2. Hvordan kan jeg indstille en String[]-parameter til en indbygget forespørgsel?

  3. Kom godt i gang med Oracle Application Express-APEX

  4. Find indeks over sidste forekomst af en understreng ved hjælp af T-SQL