Kok*_*zzu 5 arrays postgresql sql-update jsonb postgresql-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
Run Code Online (Sandbox Code Playgroud)
如何更新元素data->1,并data->3为其他的东西没有PL/*?
您不能直接操纵json/ jsonb类型的选定元素。在Postgres 9.4中仍然缺少该功能(请参阅@Craig的评论)。您必须执行3个步骤:
用pg 9.4中的给定(新)值()替换行中json数组(data->3)的第3个元素:id = 1'<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
Run Code Online (Sandbox Code Playgroud)
关于json_array_elements_text():
关于WITH ORDINALITY:
您可以从 PostgreSQL 9.5 使用jsonb_set执行此操作:
INSERT INTO test(data) VALUES('[1,2,"a",4,"8",6]');
UPDATE test SET data = jsonb_set(data, '{2}','"b"', false) WHERE id = 1
Run Code Online (Sandbox Code Playgroud)
通过简单的选择来尝试一下:
SELECT jsonb_set('[1,2,"a",4,"8",6]', '{2}','"b"', false)
-- [1, 2, "b", 4, "8", 6]
Run Code Online (Sandbox Code Playgroud)
如果你想更新两个字段,你可以这样做:
SELECT jsonb_set(jsonb_set('[1,2,"a",4,"8",6]', '{0}','100', false), '{2}','"b"', false)
-- [100, 2, "b", 4, "8", 6]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4590 次 |
| 最近记录: |