Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.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
Arrays 如何更新JSON数组Postgresql中的键_Arrays_Json_Postgresql - Fatal编程技术网

Arrays 如何更新JSON数组Postgresql中的键

Arrays 如何更新JSON数组Postgresql中的键,arrays,json,postgresql,Arrays,Json,Postgresql,我正在使用PostgreSQL 9.4.1,遇到了一个需要更新的专栏的问题。该列为JSON类型,元素格式如下: ["a","b","c",...] ["a","c","d",...] ["c","d","e",...] 等等 所以每个元素都是一个字符串。我的理解是,这些元素中的每一个都被认为是JSON数组的键(如果我在这里有点困惑,请纠正我,我以前从未使用过JSON数据类型列,所以我仍在努力掌握它们)。这些数组没有实际的模式,它们的内容依赖于其他地方的用户输入。我的目标是更新包含特定元素的任何

我正在使用PostgreSQL 9.4.1,遇到了一个需要更新的专栏的问题。该列为JSON类型,元素格式如下:

["a","b","c",...]
["a","c","d",...]
["c","d","e",...]
等等

所以每个元素都是一个字符串。我的理解是,这些元素中的每一个都被认为是JSON数组的键(如果我在这里有点困惑,请纠正我,我以前从未使用过JSON数据类型列,所以我仍在努力掌握它们)。这些数组没有实际的模式,它们的内容依赖于其他地方的用户输入。我的目标是更新包含特定元素的任何数组(为了更彻底地解释我的问题,请说“b”),并用“b1”替换内容“b”。意思是:

["a","b","c",...]
将更新为

["a","b1","c",...]
我在这个网站上找到了一些更新特定密钥值的方法(我目前没有链接,但如果必要,我可以再次找到它们),但我还没有找到一种方法来更改密钥本身。我已经找到了一种针对特定感兴趣行的方法,方法类似于:

    SELECT * 
    FROM TableA 
    WHERE column::json ?| ["b", other string elements of interest]

如有任何建议,将不胜感激。谢谢你的帮助

基本上,解决方案是遍历列表,并根据json值使用条件将某个值替换为另一个值。毕竟,需要使用
array_agg()
to_json()
重新构建新的json数组,psql中聚合函数的描述如下。 可能的查询可以是以下内容:

-- Sample DDL and JSON data
CREATE TABLE jsontest (data JSON);
INSERT INTO jsontest VALUES ('["a","b","c"]'::JSON);
-- QUERY
WITH result AS (
  SELECT to_json( -- creating updated json structure
             array_agg( -- create array with new element "b1"
                 CASE WHEN element::TEXT = '"b"' -- here we process array elements to find "b"
                   THEN to_json('b1'::TEXT)
                   ELSE element
                 END)) as new_json
  FROM jsontest,json_array_elements(jsontest.data) as element
)
UPDATE jsontest SET data = result.new_json FROM result;

基本上,解决方案是遍历列表,并根据json值使用条件将某个值替换为另一个值。毕竟,需要使用
array_agg()
to_json()
重新构建新的json数组,psql中聚合函数的描述如下。 可能的查询可以是以下内容:

-- Sample DDL and JSON data
CREATE TABLE jsontest (data JSON);
INSERT INTO jsontest VALUES ('["a","b","c"]'::JSON);
-- QUERY
WITH result AS (
  SELECT to_json( -- creating updated json structure
             array_agg( -- create array with new element "b1"
                 CASE WHEN element::TEXT = '"b"' -- here we process array elements to find "b"
                   THEN to_json('b1'::TEXT)
                   ELSE element
                 END)) as new_json
  FROM jsontest,json_array_elements(jsontest.data) as element
)
UPDATE jsontest SET data = result.new_json FROM result;

所以我继续检查了一下(因为它看起来应该是有效的,而这或多或少是我最终要做的),但我明白了我想做什么!我得到的是:

UPDATE TableA
SET column = REPLACE(column::TEXT,'b','b1')::JSON
WHERE column::JSON ?| ['b']

现在我想起来了,我甚至可能不需要最后一个where条件,因为替换不会影响任何没有“b”的东西。但这对我很有效,而且看起来你的也应该如此!谢谢你的帮助

所以我继续检查了一下(因为它看起来应该能工作,而这或多或少是我最后做的),但我明白了我想做什么!我得到的是:

UPDATE TableA
SET column = REPLACE(column::TEXT,'b','b1')::JSON
WHERE column::JSON ?| ['b']

现在我想起来了,我甚至可能不需要最后一个where条件,因为替换不会影响任何没有“b”的东西。但这对我很有效,而且看起来你的也应该如此!谢谢你的帮助

我想为json数组列重命名一个特定键。
我试过了,它在PostgreSQL 9.4上运行:

UPDATE Your_Table_Name
SET Your_Column_Name = replace(Your_Column_Name::TEXT,'Key_Old_Name','Key_New_Name')::json
WHERE attributes::jsonb ? 'Key_Old_Name'

我想为json数组列重命名一个特定键。
我试过了,它在PostgreSQL 9.4上运行:

UPDATE Your_Table_Name
SET Your_Column_Name = replace(Your_Column_Name::TEXT,'Key_Old_Name','Key_New_Name')::json
WHERE attributes::jsonb ? 'Key_Old_Name'

我需要这个用于json对象,如col name height={'unit':'cms','value':150}我需要这个用于json对象,如col name height={'unit':'cms','value':150}我需要这个用于json对象,如col name height={'unit':'cms','value':150}