2014-12-04 1 views
4

다음과 같은 테이블이 있습니다.PostgreSQL 9.4에서 json 배열의 특정 배열 요소 업데이트

CREATE TABLE test (
    id BIGSERIAL PRIMARY KEY, 
    data JSONB 
); 

INSERT INTO test(data) VALUES('[1,2,"a",4,"8",6]'); -- id = 1 
INSERT INTO test(data) VALUES('[1,2,"b",4,"7",6]'); -- id = 2 

어떻게 PL/*없이 다른 무언가로 요소 data->1data->3를 업데이트?

답변

4

json/jsonb 유형의 선택된 요소를 직접 조작 할 수 없습니다. Postgres 9.4에서는 그 기능이 아직 없습니다 (@ Craig의 코멘트 참조). 다음 세 단계를 수행해야합니다.

  1. JSON 값을 언트/분해하십시오.
  2. 선택한 요소를 조작하십시오.
  3. 값을 집계/다시 구성하십시오.

9.4 PG 주어진 (신규) 값 ('<new_value>')와 id = 1와 행의 JSON 배열 (data->3)의 3 요소를 교체하기

UPDATE test t 
SET data = t2.data 
FROM (
    SELECT id, array_to_json(
       array_agg(CASE WHEN rn = 1 THEN '<new_value>' ELSE elem END)) 
      ) AS data 
    FROM test t2 
     , json_array_elements_text(t2.data) WITH ORDINALITY x(elem, rn)   
    WHERE id = 1 
    GROUP BY 1 
    ) t2 
WHERE t.id = t2.id 
AND t.data <> t2.data; -- avoid empty updates 

정보 json_array_elements_text()을 :

는 약 WITH ORDINALITY : jsonb 값을 변환하는

+3

기능은 9.5에서 오는되어야한다. 입력을 받아 출력을 생성하는 다른 종류의 함수와 본질적으로 다른 것은 없습니다. 그것은 아무도 요소 등을 대체하는 기능을 아직 구현하지 않았다는 것입니다. –