PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да променя стойността на единично свойство в типа данни PostgreSQL JSONB?

Третият аргумент на jsonb_set() трябва да е от jsonb Тип. Проблемът е в прехвърлянето на текстов низ към низ jsonb, имате нужда от низ в двойни кавички. Можете да използвате concat() или 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)

В Postgres 9.4 трябва да разместите json колоната с помощта на jsonb_each_text(), да обобщите ключове и стойности, променяйки правилната стойност в движение, и накрая да изградите 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;

Ако можете да създавате функции, това решение може да е по-приятно:

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. pgAdmin III Защо резултатите от заявката се съкращават?

  2. Има ли многобайтов Postgresql Levenshtein?

  3. Docker Compose, Django:роля _ не съществува

  4. Може ли plv8 езиковото разширение на JavaScript да извиква библиотеки на трети страни?

  5. Опашка за задания като SQL таблица с множество потребители (PostgreSQL)