如何更新 postgresql 中的 jsonb 列,它只是一个值数组,没有键
How to update a jsonb column in postgresql which is just an array of values and no keys
我需要更新一个名为 "verticals" 的 jsonb 列,它包含的值数组如 HOM、BFB 等。数组中没有键。
Table: Product(verticals jsonb, code int)
存储在 "verticals" 列中的样本值为
[HOM,rst,NLF,WELSAK,HTL,TRV,EVCU,GRT]
我需要将 "verticals" 列中的值 'HOM' 更新为 'XXX',其中代码 =1
我的预期输出是
[XXX,rst,NLF,WELSAK,HTL,TRV,EVCU,GRT]
您应该使用 jsonb_set(target jsonb, path text[], new_value jsonb[ create_missing boolean]) 和 array_position() OR array_replace(任何数组,任何元素,任何元素)
https://www.postgresql.org/docs/9.5/static/functions-json.html
https://www.postgresql.org/docs/10/static/functions-array.html
因为您选择以非规范化的方式存储您的数据,所以更新它比它必须的更复杂。
您需要先取消嵌套数组(本质上是规范化数据),替换值,然后将它们聚合回去并更新列:
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' 附加到数组的末尾。
我需要更新一个名为 "verticals" 的 jsonb 列,它包含的值数组如 HOM、BFB 等。数组中没有键。
Table: Product(verticals jsonb, code int)
存储在 "verticals" 列中的样本值为
[HOM,rst,NLF,WELSAK,HTL,TRV,EVCU,GRT]
我需要将 "verticals" 列中的值 'HOM' 更新为 'XXX',其中代码 =1
我的预期输出是
[XXX,rst,NLF,WELSAK,HTL,TRV,EVCU,GRT]
您应该使用 jsonb_set(target jsonb, path text[], new_value jsonb[ create_missing boolean]) 和 array_position() OR array_replace(任何数组,任何元素,任何元素)
https://www.postgresql.org/docs/9.5/static/functions-json.html https://www.postgresql.org/docs/10/static/functions-array.html
因为您选择以非规范化的方式存储您的数据,所以更新它比它必须的更复杂。
您需要先取消嵌套数组(本质上是规范化数据),替换值,然后将它们聚合回去并更新列:
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' 附加到数组的末尾。