를 JSON. 나는 배열의 길이에 대해 확신 할 수 없다! 가급적이면 배열 인덱스로 와일드 카드와 함께 set_jsonb
과 같은 것을 사용하고 싶지만 지원되지 않는 것 같습니다. 그래서 가장 좋은 해결책은 무엇입니까?업데이트 포스트 그레스의 배열의 모든 값은 내가이 비슷합니다 JSON을 내 포스트 그레스 데이터베이스에서
0
A
답변
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;