我有这样的桌子;
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->1
和data->3
更新为没有PL/*
的其他内容?
您不能直接操作json
/ jsonb
类型的所选元素。在Postgres 9.4中仍然缺少该功能(请参阅@Craig的评论)。您必须执行3个步骤:
用pg 9.4中给定(新)值(data->3
)用id = 1
替换行中的json数组的第3个元素('<new_value>'
)
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_set从PostgreSQL 9.5中执行此操作: