首先,PG9.4 已经过时,甚至现在还没有完善。 PG9.5 包含 as json_set 函数:
SELECT jsonb_set(status::jsonb,
'{provisioningStatus}',
to_jsonb('In Progress'))::jsonb
FROM ....;
作为使用连接的可能性 || swith 转换为 jsonb 而不是返回:
SELECT (status::jsonb || '{"provisioningStatus": "In Progress"}')::json
FROM ....;
对于 PG9.4,如果你知道 json 的 schema,你可以使用 json_populate_record/row_to_json :
SELECT (
SELECT row_to_json(r)
FROM (
SELECT r.*, 'In Progress' AS provisioningStatus
FROM json_populate_record(null::myrowtype, status) AS r
) AS r
) AS result
FROM ....
或者你可以使用json_each_text:
SELECT (
SELECT json_object_agg(key, value)
FROM (
SELECT *
FROM json_each_text(status)
UNION ALL
SELECT 'provisioningStatus', 'In Progress'
) AS a
) AS result
FROM ...
可能最后一个(但丑陋的)方法只是将json转换为字符串,删除最后一个'}',添加“provisioningStatus”:“In Progress”}'并转换回json:
SELECT (substr(status::text, 1, length(status::text) - 1)
|| ', "provisioningStatus": "In Progress"}')::json
FROM ...