2017-10-17 54 views
0

我一定会缺少一些东西......似乎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

回答

1

文件称:

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) 
+0

谢谢 - 我想我可以使用第二个选项。值'v2'来自另一个查询,但我可以使用'JSON_BUILD_OBJECT('​​value',(QUERY))'对它进行json化 - 对吧? – user9645

+0

是的,如果查询结果只有单个值,最好是json。 –

相关问题