从同一表中的其他列更新JSONB列数据
在Postgres 9.5中,我想用同一表中其他列的数据更新一列。问题在于“从同一表中的其他列更新JSONB列数据,json,postgresql,sql-update,jsonb,Json,Postgresql,Sql Update,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 {"EstimatedRe
”
符号,因为在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\u结果
:
{"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}
{"EstimatedResult": {"revid": "revision", "displ": "var_data"}, "RevOnly": 10}
{"EstimatedResult": {"revid": "revision", "displ": "var_data"}, "RevOnly": 20}
{"EstimatedResult": {"revid": "revision", "displ": "var_data"}, "RevOnly": 30}
我知道如何使用示例1强制使用“RevOnly”中的colums数据。
但是,我没有成功地强制列中的数据为“revid”和“displ”
我成功地生成了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}
{"EstimatedResult": {"revid": "revision", "displ": "var_data"}, "RevOnly": 10}
{"EstimatedResult": {"revid": "revision", "displ": "var_data"}, "RevOnly": 20}
{"EstimatedResult": {"revid": "revision", "displ": "var_data"}, "RevOnly": 30}
注:“修订”和“var_数据”未更新
如何正确更新?假设至少有Postgres 9.5和数据类型
jsonb
一种优雅的方法是使用-与您已经成功使用的
jsonb\u build\u object()结合使用:
SELECT jsonb_set(json_result
, '{EstimatedResult}'
, jsonb_build_object('revid', revision, 'displ', var_data))
FROM sample_table;
这个UPDATE
命令完全符合我的要求。
以防有人需要它
UPDATE public.sample_table SET json_result =
jsonb_set(json_result
, '{EstimatedResult}'
, jsonb_build_object('revid', revision::numeric, 'displ', var_data::text))
WHERE json_result->>'EstimatedResult' IS NOT NULL
RETURNING *;
谢谢你,欧文。是的,它工作了,它是第9.5页,是的,它是::jsonb