2017-09-05 36 views
0

我有一個json列。該對象具有嵌套字段,例如Postgres 9.5更新內部json字段

{ 
    "logo": { 
    "url": "https://foo.bar" 
    ... 
    } 
    ... 
} 

對象具有更多的字段,但url場就是我要更新的一個。我相信我應該使用json_set之類的東西,但我對json路徑感到迷茫。我能舉一個例子嗎?

回答

1

你不能做到這一點與json只有jsonb(但你可以輕鬆地投現有的值)

隨着jsonb_set您需要提供的路徑,你要更改的對象,所以這將是'{logo,url}'

以下:

with t (data) as (
    values 
    ('{ 
     "logo": { "url": "https://foo.bar", "something" : "some value"}, 
     "other" : { "one": "two"} 
     }'::jsonb 
    ) 
) 
select jsonb_set(data, '{logo,url}', to_jsonb('http://bar.foo'::text)) 
from t; 

(該WITH部分是隻存在產生僞數據)

回報:

jsonb_set                    
--------------------------------------------------------------------------------------- 
{"logo": {"url": "http://bar.foo", "something": "some value"}, "other": {"one": "two"}} 

正如你所看到的,只有url屬性被換下,其他一切都保持原樣。

如果列是一個真正的JSON,只是使用your_column::jsonb,使您可以使用jsonb_set()