所以我想试试PostgreSQL的jsonb
。在我的表格中,我有一个名为extras
jsonb
类型的列。
extras
中的示例数据看起来像{"param1": 10, "param2": 15}
我想仅使用sql语句修改JSON。我想做这样的事情:
如果param1
extras
超过12,则在param2
字段的extras
更新{{1}}。
如何编写这样的SQL语句?我知道我可以很容易地在应用程序层中执行此操作,但我想在SQL层本身中执行此操作,因为我可能会处理的行数会很大而且我不想在db-application中浪费时间 - db往返
答案 0 :(得分:6)
这应该用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)
答案 1 :(得分:0)
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)