更新PostgreSQL 9.4中json数组的某些数组元素

问题描述 投票:5回答:2

我有这样的桌子;

CREATE TABLE test (
  id BIGSERIAL PRIMARY KEY,
  data JSONB
);

INSERT INTO test(data) VALUES('[1,2,"a",4,"8",6]'); -- id = 1
INSERT INTO test(data) VALUES('[1,2,"b",4,"7",6]'); -- id = 2

如何将元素data->1data->3更新为没有PL/*的其他内容?

arrays postgresql sql-update postgresql-9.4 jsonb
2个回答
5
投票

您不能直接操作json / jsonb类型的所选元素。在Postgres 9.4中仍然缺少该功能(请参阅@Craig的评论)。您必须执行3个步骤:

  1. 取消嵌套/分解JSON值。
  2. 操纵选定的元素。
  3. 汇总/重新组合值。

用pg 9.4中给定(新)值(data->3)用id = 1替换行中的json数组的第3个元素'<new_value>'

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()


1
投票

您可以使用jsonb_set从PostgreSQL 9.5中执行此操作:

© www.soinside.com 2019 - 2024. All rights reserved.