2017-04-20 10 views
0

で配列内のすべての値が、私はこれに似JSONを持っている:更新私のPostgresデータベースにPostgresのJSON

{ 
    "myArray": [ 
     { 
      "myValue": 1 
     }, 
     { 
      "myValue": 2 
     }, 
     { 
      "myValue": 3 
     } 
    ] 
} 

今、私はotherValuemyValueの名前を変更したいです。私は配列の長さについてはわかりません!私は、配列インデックスとしてワイルドカードを使用してset_jsonbのようなものを使用したいと考えていますが、それはサポートされていないようです。だから、一番いい解決策は何ですか?

答えて

1

jsonbオブジェクト全体を分解し、個々の要素を修正し、オブジェクトを元に戻す必要があります。

カスタム機能が役に立ちます。

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) 
$$; 

用途:

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

JSONの機能を使用して、間違いなく最もエレガントですが、あなたは文字の置換を使用してすることによって得ることができます。 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

関連する問題