2017-09-05 10 views
0

私はjson列を持っています。オブジェクトにはネストされたフィールドがあります。Postgres 9.5の更新内部jsonフィールド

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

オブジェクトは、複数のフィールドを持っていますが、urlフィールドは、私が更新したいものです。私はjson_setのようなものを使うべきだと思っていますが、jsonのパスに関しては失われています。例がありますか?

答えて

1

あなたは行うことができないとjsonだけでjsonbそれは'{logo,url}'になりので、あなたは、あなたが変更したいオブジェクトへのパスを提供する必要がありjsonb_set

(しかし、あなたは簡単に既存の値をキャストすることができます) :

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()

関連する問題