如何使用PostgreSQL JSONB_SET()来创建新的深对象元素
问题描述:
我一定会缺少一些东西......似乎JSONB_SET()
不能用作advertised?如何使用PostgreSQL JSONB_SET()来创建新的深对象元素
SELECT JSONB_SET(
'{"k1": {"value": "v1"}}',
'{k2,value}',
'"v2"',
TRUE
);
结果:
----+------------------------
| jsonb_set
| jsonb
----+------------------------
1 | {"k1": {"value": "v1"}}
----+------------------------
我期待{"k1": {"value": "v1"}, "k2": {"value": "v2"}}
我也试过FALSE
在它被逆转的情况下什么的第四个参数。
我使用PostgreSQL 9.6.4
答
文件称:
jsonb_set(目标jsonb,路径文本[],NEW_VALUE jsonb [,create_missing 布尔])
在你的例子中,第二个参数 - '{k2,value}'
是搜索路径,但由于第一个路径是k2
,它不存在,所以在之前结果为NULL value
可以添加/替换。
简而言之 - jsonb_set并不意味着以您尝试使用搜索路径的方式构建整个JSON文档,而是要添加或替换单个键/值。
如果你想添加/更换一套全新的JSON的一样,你可以使用||
(串连)运营商,而不是这样的:
-- Add example:
SELECT $${"k1": {"value": "v1"}}$$::jsonb || $${ "k2": { "value": "v2"}}$$::jsonb;
?column?
------------------------------------------------
{"k1": {"value": "v1"}, "k2": {"value": "v2"}}
(1 row)
-- Replace example
SELECT $${"k1": {"value": "v1"}}$$::jsonb || $${ "k1": { "value": "v2"}}$$::jsonb;
?column?
-------------------------
{"k1": {"value": "v2"}}
(1 row)
OR
您可以使用jsonb_set()
像相反:
SELECT JSONB_SET(
'{"k1": {"value": "v1"}}',
'{k2}',
'{"value": "v2"}',
TRUE
);
jsonb_set
------------------------------------------------
{"k1": {"value": "v1"}, "k2": {"value": "v2"}}
(1 row)
谢谢 - 我想我可以使用第二个选项。值'v2'来自另一个查询,但我可以使用'JSON_BUILD_OBJECT('value',(QUERY))'对它进行json化 - 对吧? – user9645
是的,如果查询结果只有单个值,最好是json。 –