Postgresql

在 PostgreSQL 9.4 中推送或附加到 JSON 數組

  • July 31, 2020

我有一個表,其中一個欄位是 JSON 數組。我需要在不覆蓋現有值的情況下將接收到的 JSON 數組附加到該欄位中。

像這樣的東西:

CREATE OR REPLACE FUNCTION add_array(
   array_received json[])
 RETURNS void AS
$BODY$

   update table set _array_field = _array_field | array_received ...;

$BODY$
 LANGUAGE plpgsql VOLATILE;

在 9.5 之前的版本中,您可以像這樣使用json_array_elements, 和array_to_json(array_agg())

SELECT array_to_json(array_agg(x))
FROM (
 SELECT jsonb_array_elements('[1,2,3]'::jsonb)
 UNION ALL SELECT '4'::jsonb
) AS t(x);

您也可以使用這樣的ARRAY建構子來編寫它..

SELECT array_to_json(ARRAY(
 SELECT jsonb_array_elements('[1,2,3]'::jsonb)
 UNION ALL SELECT '4'::jsonb
));

面臨類似的問題,所以我嘗試了以下對我有用的方法。我的架構是這樣的, temptable(id serial, events jsonb) 而 jsonb 數組是這樣的,

[{"ts": "t1", "event": "e1", "value": {"search": ["s1"]}}, {"ts": "t2", "event": "e2", "value": {"search": ["s2"]}}]

我的目標是'{"event":"e2","value":{"search":["s2"]},"ts":"t2"}'在數組中添加一個新項目(),

以下查詢對我有用

--insert an array element
UPDATE temptable
SET events = jsonb_set(
 events::jsonb,
 concat('{',jsonb_array_length(events),'}')::text[],
 '{"event":"f2","value":{"search":["f2"]},"ts":"f2"}'::jsonb) 
WHERE id = 6;

引用自:https://dba.stackexchange.com/questions/102906