Postgresql
在 PostgreSQL 9.4 中推送或附加到 JSON 數組
我有一個表,其中一個欄位是 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;