2017-04-20 8 views

답변

1

전체 jsonb 오브젝트를 분해하고 개별 요소를 수정하고 오브젝트를 다시 빌드해야합니다.

JSON 기능을 사용
with my_table (id, data) as (
values(1, 
'{ 
    "myArray": [ 
     { 
      "myValue": 1 
     }, 
     { 
      "myValue": 2 
     }, 
     { 
      "myValue": 3 
     } 
    ] 
}'::jsonb) 
) 

select 
    id, 
    jsonb_build_object(
     'myArray', 
     jsonb_change_keys_in_array(data->'myArray', 'myValue', 'otherValue') 
     ) 
from my_table; 

id |       jsonb_build_object       
----+------------------------------------------------------------------------ 
    1 | {"myArray": [{"otherValue": 1}, {"otherValue": 2}, {"otherValue": 3}]} 
(1 row) 
0

확실히 가장 우아한,하지만 당신은 문자 교환을 사용하여 얻을 수 있습니다 :

create or replace function jsonb_change_keys_in_array(arr jsonb, old_key text, new_key text) 
returns jsonb language sql as $$ 
    select jsonb_agg(case 
     when value->old_key is null then value 
     else value- old_key || jsonb_build_object(new_key, value->old_key) 
     end) 
    from jsonb_array_elements(arr) 
$$; 

사용 :

사용자 정의 기능이 도움이 될 것입니다. json (b)을 텍스트로 변환하고 바꾸기를 수행 한 다음 json (b)으로 다시 변경하십시오. 이 예제에서는 텍스트와 값 사이의 충돌없이 json 키를 대체하는 데 도움이되는 따옴표와 콜론을 포함 시켰습니다.

CREATE TABLE mytable (id INT, data JSONB); 

INSERT INTO mytable VALUES (1, '{"myArray": [{"myValue": 1},{"myValue": 2},{"myValue": 3}]}'); 
INSERT INTO mytable VALUES (2, '{"myArray": [{"myValue": 4},{"myValue": 5},{"myValue": 6}]}'); 

SELECT * FROM mytable; 

UPDATE mytable 
SET data = REPLACE(data :: TEXT, '"myValue":', '"otherValue":') :: JSONB; 

SELECT * FROM mytable; 

http://sqlfiddle.com/#!17/1c28a/9/4