2014-12-04 75 views
4

我有這樣的表;更新某些陣列元件9.4

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 

如何更新元素data->1data->3到不PL/*其他什麼東西?

回答

4

不能直接操縱一個json/jsonb類型的所選元件。 Postgres 9.4仍然沒有提供這方面的功能(參見@ Craig的評論)。你必須做3個步驟:

  1. Unnest /分解JSON值。
  2. 操縱選擇的元素。
  3. 骨料/再次譜寫的價值。

要以pg 9.4id = 1與給定的(新)值('<new_value>')替換該行中的JSON數組(data->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

+3

職能轉變jsonb值應在9.5到來。對於任何需要輸入和產生輸出的其他功能來說,沒有什麼不同。主要是沒有人實現了替換元素等功能。 – 2014-12-09 13:40:52