2014-12-04 4 views

ответ

4

Вы не можете манипулировать выбранными элементами типа json/jsonb напрямую. Функциональность для этого все еще отсутствует в Postgres 9.4 (см. Комментарий Крейга). Вы должны сделать 3 этапа:

  1. Unnest/разложить значение JSON.
  2. Манипулировать выбранными элементами.
  3. Совокупность/составьте значение обратно.

Для замены 3-й элемент массива (data->3) JSon в ряд с id = 1 с заданной (новое) значение ('<new_value>') в пг 9.4:

UPDATE test t 
SET data = t2.data 
FROM (
    SELECT id, array_to_json(
       array_agg(CASE WHEN rn = 1 THEN '<new_value>' ELSE elem END)) 
      ) AS data 
    FROM test t2 
     , json_array_elements_text(t2.data) WITH ORDINALITY x(elem, rn)   
    WHERE id = 1 
    GROUP BY 1 
    ) t2 
WHERE t.id = t2.id 
AND t.data <> t2.data; -- avoid empty updates 

О json_array_elements_text() :

О WITH ORDINALITY:

+3

Функции для преобразования значения jsonb должны приходить в 9.5. Ничто по своей сути не отличается от любой другой функции, которая принимает входные данные и производит выходные данные. В основном, никто не реализовал функции для замены элементов и т. Д. –