PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak zmodyfikować pojedynczą wartość właściwości w typie danych PostgreSQL JSONB?

Trzeci argument jsonb_set() powinien być jsonb rodzaj. Problem polega na rzuceniu ciągu tekstowego na ciąg jsonb, potrzebujesz ciągu w podwójnych cudzysłowach. Możesz użyć concat() lub 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)

W Postgresie 9.4 powinieneś rozpakować kolumnę json za pomocą jsonb_each_text(), agregować klucze i wartości modyfikując odpowiednią wartość w locie, a na koniec zbudować obiekt 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;

Jeśli potrafisz tworzyć funkcje, to rozwiązanie może być przyjemniejsze:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak sprawdzić stan serwera PostgreSQL Mac OS X?

  2. Jak zainstalować wiele serwerów PostgreSQL w systemie RedHat Linux?

  3. Zbuduj kontener docker postgres z początkowym schematem

  4. Automatyczne zwiększanie częściowego klucza podstawowego za pomocą Entity Framework Core

  5. Wartość Auto-Incremented nie działa w PostgreSQL podczas korzystania z EntityFramework Core