2014-12-04 86 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