Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从同一表中的其他列更新JSONB列数据_Json_Postgresql_Sql Update_Jsonb - Fatal编程技术网

从同一表中的其他列更新JSONB列数据

从同一表中的其他列更新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

在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\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