2016-02-08 59 views
0

的JSON列“数据” JSON数据类型内的值的值包含值一样如何连接Postgres里

{"avatar":"kiran1454916822955.jpg","name":"shanthitwos charmlyi"}

我想连接images/profiles/uploads/所有JSON关键化身。

我试图

UPDATE activity SET data->'avatar' = CONCAT('images/profiles/uploads/',data->'avatar') 
+0

Postgres版本? – klin

+0

PostgreSQL 9.4.5 – Shanthi

回答

1

示例数据:

create table activity (data json); 
insert into activity values 
('{"avatar":"first.jpg","name":"first name"}'), 
('{"avatar":"second.jpg","name":"second name"}'), 
('{"avatar":"third.jpg","name":"third name"}'); 

的Postgres 9.4你应该创建一个辅助功能:

create or replace function add_path_to_avatar(json) 
returns json language sql as $$ 
    select json_object_agg(key, value) 
    from (
     select 
      key, 
      case key::text when 'avatar' then 
       'images/profiles/uploads/' || value 
      else value 
      end 
     from json_each_text($1) 
    ) s 
$$; 

update activity 
set data = add_path_to_avatar(data) 
returning data; 

            data          
----------------------------------------------------------------------------- 
{ "avatar" : "images/profiles/uploads/first.jpg", "name" : "first name" } 
{ "avatar" : "images/profiles/uploads/second.jpg", "name" : "second name" } 
{ "avatar" : "images/profiles/uploads/third.jpg", "name" : "third name" } 
(3 rows)  

的Postgres 9.5可以使用功能jsonb_set()

update activity 
set data = jsonb_set(
    data::jsonb, 
    '{avatar}', 
    format('"images/profiles/uploads/%s"', data#>>'{avatar}')::jsonb);