簡體   English   中英

更新 PostgreSQL 9.4 中 json 數組的某些數組元素

[英]Update certain array elements of a json array in PostgreSQL 9.4

我有一張這樣的桌子;

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

如何在沒有PL/*情況下將元素data->1data->3為其他內容?

您不能直接操作json / jsonb類型的選定元素。 Postgres 9.4 中仍然缺少該功能(請參閱@Craig 的評論)。 你必須做3個步驟:

  1. 取消嵌套/分解 JSON 值。
  2. 操作選定的元素。
  3. 再次聚合/組合該值。

用 pg 9.4 中的給定(新)值( '<new_value>' )替換id = 1行中json 數組data->3 )的第三個元素

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

您可以使用jsonb_set從 PostgreSQL 9.5 執行此操作

INSERT INTO test(data) VALUES('[1,2,"a",4,"8",6]');
UPDATE test SET data = jsonb_set(data, '{2}','"b"', false) WHERE id = 1

用一個簡單的選擇試試看:

SELECT jsonb_set('[1,2,"a",4,"8",6]', '{2}','"b"', false)
-- [1, 2, "b", 4, "8", 6]

如果你想更新兩個字段,你可以這樣做:

SELECT jsonb_set(jsonb_set('[1,2,"a",4,"8",6]', '{0}','100', false), '{2}','"b"', false)
-- [100, 2, "b", 4, "8", 6]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM