【问题标题】:How to update a jsonb column in postgresql which is just an array of values and no keys如何更新postgresql中的jsonb列,它只是一个值数组,没有键
【发布时间】:2019-02-23 07:08:44
【问题描述】:

我需要更新一个名为“verticals”的 jsonb 列,它包含的值数组类似于 HOM、BFB 等。数组中没有键。

表:Product(verticals jsonb, code int)

存储在“verticals”列中的样本值是

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

我需要在 code =1 的“verticals”列中将值 'HOM' 更新为 'XXX'

我的预期输出是

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

【问题讨论】:

标签: postgresql jsonb postgresql-9.5


【解决方案1】:

因为您选择以非规范化方式存储数据,所以更新它比它必须要复杂得多。

您需要首先取消嵌套数组(本质上是对数据进行规范化),替换值,然后将它们聚合回来并更新列:

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”附加到数组的末尾。

【讨论】:

  • 只需在内部查询中的代码上添加 group by 就可以很好地工作。
【解决方案2】:

你应该使用 jsonb_set(target jsonb, path text[], new_value jsonb[, create_missing boolean]) 和 array_position() OR 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 2016-07-14
    • 1970-01-01
    • 2021-09-09
    • 2021-12-27
    • 1970-01-01
    相关资源
    最近更新 更多