Как обновить столбец jsonb в postgresql, который представляет собой просто массив значений без ключей - PullRequest
0 голосов
/ 19 сентября 2018

Мне нужно обновить столбец jsonb, который называется «вертикали», и массив значений, которые он содержит, похож на HOM, BFB и т. Д. В массиве нет ключей.

Таблица: Product(verticals jsonb, code int)

значение выборки, хранящееся в столбце «вертикали», равно

[HOM,rst,NLF,WELSAK,HTL,TRV,EVCU,GRT]

Мне нужно обновить значение «HOM» до «XXX» в столбце «вертикали», где код = 1

Мой ожидаемый результат -

[XXX,rst,NLF,WELSAK,HTL,TRV,EVCU,GRT]

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Поскольку вы решили хранить свои данные ненормализованным способом, обновление их сложнее, чем должно быть.

Сначала необходимо развернуть массив (по существу, нормализуя данные), заменить значения, затем агрегировать их обратно и обновить столбец:

update product p
  set verticals = t.verticals
from (
  select jsonb_agg(case when x.v = 'HOM' then 'XXX' else x.v end order by idx) as verticals
  from product p2, jsonb_array_elements_text(p2.verticals) with ordinality as x(v,idx)
  where code = 1
) t
where p.code = t.code;

Предполагается, что product.code являетсяпервичный (или уникальный) ключ!

Онлайн пример: http://rextester.com/KZQ65481


Если порядок элементов массива не важен, это становится проще:

update product
   set verticals = (verticals - 'HOM')||'["XXX"]'
where code = 1;

При этом удаляется элемент «HOM» из массива (независимо от местоположения), а затем добавляется «XXX» в конец массива.

0 голосов
/ 19 сентября 2018

Вы должны использовать jsonb_set (целевой jsonb, текст пути [], новое_значение jsonb [, create_missing логическое значение]) и array_position () ИЛИ array_replace (anyarray, anyelement, anyelement)

https://www.postgresql.org/docs/9.5/static/functions-json.html https://www.postgresql.org/docs/10/static/functions-array.html

...