sql >> Databáze >  >> RDS >> PostgreSQL

Jak mohu upravit jednu hodnotu vlastnosti uvnitř datového typu PostgreSQL JSONB?

Třetí argument jsonb_set() by měl být jsonb typ. Problém je v přetypování textového řetězce na řetězec jsonb, potřebujete řetězec ve dvojitých uvozovkách. Můžete použít concat() nebo format() :

update animal
set info = 
    jsonb_set(info, '{location}', concat('"', lower(info->>'location'), '"')::jsonb, true) 
--  jsonb_set(info, '{location}', format('"%s"', lower(info->>'location'))::jsonb, true) 
where id='49493'
returning *;

  id   |                               info                               
-------+------------------------------------------------------------------
 49493 | {"habit1": "fly", "habit2": "dive", "location": "sonoma narite"}
(1 row)

V Postgres 9.4 měli byste zrušit vnoření sloupce json pomocí jsonb_each_text(), agregovat klíče a hodnoty za běhu upravující správnou hodnotu a nakonec vytvořit objekt json:

update animal a
set info = u.info
from (
    select id, json_object(
        array_agg(key), 
        array_agg(
            case key when 'location' then lower(value)
            else value end))::jsonb as info
    from animal,
    lateral jsonb_each_text(info) 
    group by 1
    ) u
where u.id = a.id
and a.id = 49493;

Pokud umíte vytvářet funkce, může být toto řešení příjemnější:

create or replace function update_info(info jsonb)
returns jsonb language sql as $$
    select json_object(
        array_agg(key), 
        array_agg(
            case key when 'location' then lower(value)
            else value end))::jsonb
    from jsonb_each_text(info)
$$

update animal
set info = update_info(info)
where id = 49493;


  1. Formátování dat ve vizualizacích Power BI Desktop

  2. Jak by DevOps měli používat DBaaS (databáze jako služba) k optimalizaci vývoje svých aplikací​

  3. Změňte více sloupců v jednom příkazu

  4. Entity Developer a poskytovatelé dat ADO.Net nyní podporují Entity Framework Core 5