如何更新 PostgreSQL 中的 jsonb 列字段?
How to update a jsonb column's field in PostgreSQL?
所以我想尝试 jsonb
的 PostgreSQL。在我的 table 中,我有一个名为 extras
的 jsonb
类型的列。
extras
中的样本数据看起来像 {"param1": 10, "param2": 15}
我只想使用 sql 语句修改 JSON。我想做这样的事情:
如果 extras
的 param2
超过 12,则更新 extras
字段的 param1
,方法是将其值加 10。
我怎样才能写出这样的 SQL 语句?我知道我可以在应用层轻松地做到这一点,但我想在 SQL 层本身做到这一点,因为我可能要处理的行数会很大,我不想浪费时间db-application-db 往返
jsonb
类型用于存储整个文档。如果更改文档的任何部分,则需要为该列分配一个新值。因为 Postgres 会保留旧版本一段时间,这是一项昂贵的操作。
考虑到这一点,下面是如何不更新 jsonb
列的示例:
create table t1 (doc jsonb);
insert into t1 values
('{"param1": 10, "param2": 15}'),
('{"param1": 10, "param2": 5}');
update t1
set doc = ('{"param1": ' ||
((doc->'param1')::text::int + 10)::text ||
', "param2": ' ||
(doc->'param2')::text ||
'}')::jsonb
where (doc->'param2')::text::int > 12;
select * from t1;
这会打印:
doc
------------------------------
{"param1": 10, "param2": 5}
{"param1": 20, "param2": 15}
(2 rows)
这应该在 PostgreSQL 9.5 中完成:
create table t (extras jsonb);
insert into t values
('{"param1": 10, "param2": 15}'),
('{"param1": 10, "param2": 5}');
UPDATE t
SET extras = jsonb_set(extras, '{param1}', ((extras->>'param1')::real + 10)::text::jsonb)
WHERE (extras#>>'{param2}')::real > 12;
select * from t;
extras
------------------------------
{"param1": 10, "param2": 5}
{"param1": 20, "param2": 15}
(2 rows)
所以我想尝试 jsonb
的 PostgreSQL。在我的 table 中,我有一个名为 extras
的 jsonb
类型的列。
extras
中的样本数据看起来像 {"param1": 10, "param2": 15}
我只想使用 sql 语句修改 JSON。我想做这样的事情:
如果 extras
的 param2
超过 12,则更新 extras
字段的 param1
,方法是将其值加 10。
我怎样才能写出这样的 SQL 语句?我知道我可以在应用层轻松地做到这一点,但我想在 SQL 层本身做到这一点,因为我可能要处理的行数会很大,我不想浪费时间db-application-db 往返
jsonb
类型用于存储整个文档。如果更改文档的任何部分,则需要为该列分配一个新值。因为 Postgres 会保留旧版本一段时间,这是一项昂贵的操作。
考虑到这一点,下面是如何不更新 jsonb
列的示例:
create table t1 (doc jsonb);
insert into t1 values
('{"param1": 10, "param2": 15}'),
('{"param1": 10, "param2": 5}');
update t1
set doc = ('{"param1": ' ||
((doc->'param1')::text::int + 10)::text ||
', "param2": ' ||
(doc->'param2')::text ||
'}')::jsonb
where (doc->'param2')::text::int > 12;
select * from t1;
这会打印:
doc
------------------------------
{"param1": 10, "param2": 5}
{"param1": 20, "param2": 15}
(2 rows)
这应该在 PostgreSQL 9.5 中完成:
create table t (extras jsonb);
insert into t values
('{"param1": 10, "param2": 15}'),
('{"param1": 10, "param2": 5}');
UPDATE t
SET extras = jsonb_set(extras, '{param1}', ((extras->>'param1')::real + 10)::text::jsonb)
WHERE (extras#>>'{param2}')::real > 12;
select * from t;
extras
------------------------------
{"param1": 10, "param2": 5}
{"param1": 20, "param2": 15}
(2 rows)