json - 从同一个表中的其他列更新 JSONB 列数据
问题描述
在Postgres 9.5中,我想用同一张表中其他列的数据更新一列。问题在于""
符号,因为在 JSON 字符串中它不允许从实际列中读取数据:
CREATE TABLE sample_table(
id bigint
, revision integer
, var_data text
, json_result jsonb
);
样本数据:
id revision var_data json_result
1 10 test_A {"EstimatedResult": 10, "RevOnly": 10}
2 20 test_B {"EstimatedResult": 20, "RevOnly": 20}
3 30 test_C {"EstimatedResult": 30, "RevOnly": 30}
示例 1:这是有效的:
UPDATE "public"."sample_table"
SET "json_result" = "json_result" - 'EstimatedResult'
|| jsonb_build_object('EstimatedResult', revision::numeric)::jsonb
WHERE json_result->>'EstimatedResult' IS NOT NULL;
结果json_result
:
{"EstimatedResult": 10, "RevOnly": 10}
{"EstimatedResult": 20, "RevOnly": 20}
{"EstimatedResult": 30, "RevOnly": 30}
示例 2:这无法正常工作:
要求是修改 json 结构以插入来自多列的数据。结果应该是这样的:
{"EstimatedResult": {"revid": 10, "displ": "test_A"}, "RevOnly": 10}
{"EstimatedResult": {"revid": 20, "displ": "test_B"}, "RevOnly": 20}
{"EstimatedResult": {"revid": 30, "displ": "test_C"}, "RevOnly": 30}
我知道如何使用 Example1 从“RevOnly”中的列中强制数据。但是,我没有成功强制列中的数据是“revid”和“displ”
我成功生成了 JSON 值,但结果是这样的:
{"EstimatedResult": {"revid": "revision", "displ": "var_data"}, "RevOnly": 10}
{"EstimatedResult": {"revid": "revision", "displ": "var_data"}, "RevOnly": 20}
{"EstimatedResult": {"revid": "revision", "displ": "var_data"}, "RevOnly": 30}
注意“revision”和“var_data”没有更新。
如何正确更新?
解决方案
假设至少 Postgres 9.5和 data type jsonb
。
一种优雅的方式是与jsonb_set()
- 结合jsonb_build_object()
你已经成功使用:
SELECT jsonb_set(json_result
, '{EstimatedResult}'
, jsonb_build_object('revid', revision, 'displ', var_data))
FROM sample_table;
推荐阅读
- php - 使用相关字段更新项目的示例过滤器挂钩
- powershell - 将重定向从批处理重定向到 powershell
- jquery - 如何在 jquery mobile 中以编程方式更新滑块值
- php - 我做错了什么?“会话开始”
- python-3.x - Python: Unit Tests/ Integration Tests: Workaround for file paths?
- spring-boot - 有没有办法从 config.xml 设置 @EnableConfigurationProperties?
- javascript - 渲染 Slickgrid 直到调整其某些列的宽度
- css - 只有当它们适合父母的宽度时,我才能并排制作三个 DIV 吗?
- flutter - The named parameter children isnt defined
- docker - Airflow how to mount airflow.cfg in docker container