在 PostgreSQL 9.5+ 中追加(推送)和从 JSON 数组中删除
Appending (pushing) and removing from a JSON array in PostgreSQL 9.5+
For versions less than 9.5 see this question
我已经在 PostgreSQL 中创建了一个 table:
CREATE TEMP TABLE jsontesting
AS
SELECT id, jsondata::jsonb FROM ( VALUES
(1, '["abra","value","mango", "apple", "sample"]'),
(2, '["japan","china","india", "russia", "australia"]'),
(3, '["must", "match"]'),
(4, '["abra","value","true", "apple", "sample"]'),
(5, '["abra","false","mango", "apple", "sample"]'),
(6, '["string","value","mango", "apple", "sample"]'),
(7, '["must", "watch"]')
) AS t(id,jsondata);
现在我想要的是
add 像 append_to_json_array 这样的东西接收实际的 json 数据一个 json-array 和我必须添加到那个 jsondata 数组的 newString,这个函数应该 return 更新的 json-array。
UPDATE jsontesting
SET jsondata=append_to_json_array(jsondata, 'newString')
WHERE id = 7;
从 json 数据数组中删除 一个值,一个用于删除该值的函数。
我试图搜索 PostgreSQL 的文档,但在那里找不到任何东西。
要添加值,请使用 JSON 数组追加运算符 (||
)
UPDATE jsontesting
SET jsondata = jsondata || '["newString"]'::jsonb
WHERE id = 7;
删除值如下所示
UPDATE jsontesting
SET jsondata = jsondata - "newString"
WHERE id = 7;
连接到嵌套字段如下所示
UPDATE jsontesting
SET jsondata = jsonb_set(
jsondata::jsonb,
array['nestedfield'],
(jsondata->'nestedfield')::jsonb || '["newString"]'::jsonb)
WHERE id = 7;
要添加到 Evan Carroll 的回答中,您可能需要执行以下操作以将列设置为空数组(如果它是 NULL
)。如果列当前为 NULL
.
,则追加运算符 (||
) 不执行任何操作
UPDATE jsontesting SET jsondata = (
CASE
WHEN jsondata IS NULL THEN '[]'::JSONB
ELSE jsondata
END
) || '["newString"]'::JSONB WHERE id = 7;
我在使用新的键值对附加到 postgres 中的现有 json 数据时遇到了类似的问题。
我能够使用附加运算符 ||
解决此问题,如下所示:
UPDATE jsontesting
SET jsondata = jsondata::jsonb || '{"add_new_data": true}'
WHERE id = 7;
For versions less than 9.5 see this question
我已经在 PostgreSQL 中创建了一个 table:
CREATE TEMP TABLE jsontesting
AS
SELECT id, jsondata::jsonb FROM ( VALUES
(1, '["abra","value","mango", "apple", "sample"]'),
(2, '["japan","china","india", "russia", "australia"]'),
(3, '["must", "match"]'),
(4, '["abra","value","true", "apple", "sample"]'),
(5, '["abra","false","mango", "apple", "sample"]'),
(6, '["string","value","mango", "apple", "sample"]'),
(7, '["must", "watch"]')
) AS t(id,jsondata);
现在我想要的是
add 像 append_to_json_array 这样的东西接收实际的 json 数据一个 json-array 和我必须添加到那个 jsondata 数组的 newString,这个函数应该 return 更新的 json-array。
UPDATE jsontesting SET jsondata=append_to_json_array(jsondata, 'newString') WHERE id = 7;
从 json 数据数组中删除 一个值,一个用于删除该值的函数。
我试图搜索 PostgreSQL 的文档,但在那里找不到任何东西。
要添加值,请使用 JSON 数组追加运算符 (||
)
UPDATE jsontesting
SET jsondata = jsondata || '["newString"]'::jsonb
WHERE id = 7;
删除值如下所示
UPDATE jsontesting
SET jsondata = jsondata - "newString"
WHERE id = 7;
连接到嵌套字段如下所示
UPDATE jsontesting
SET jsondata = jsonb_set(
jsondata::jsonb,
array['nestedfield'],
(jsondata->'nestedfield')::jsonb || '["newString"]'::jsonb)
WHERE id = 7;
要添加到 Evan Carroll 的回答中,您可能需要执行以下操作以将列设置为空数组(如果它是 NULL
)。如果列当前为 NULL
.
||
) 不执行任何操作
UPDATE jsontesting SET jsondata = (
CASE
WHEN jsondata IS NULL THEN '[]'::JSONB
ELSE jsondata
END
) || '["newString"]'::JSONB WHERE id = 7;
我在使用新的键值对附加到 postgres 中的现有 json 数据时遇到了类似的问题。
我能够使用附加运算符 ||
解决此问题,如下所示:
UPDATE jsontesting
SET jsondata = jsondata::jsonb || '{"add_new_data": true}'
WHERE id = 7;