如何更新JSON数组Postgresql中的键

时间:2015-09-16 14:13:57

标签: arrays json postgresql

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

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

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

["a","b","c",...]

将更新为

["a","b1","c",...]

我发现本网站上列出了一些方法(我目前没有链接,但如果有必要,我可以再次找到它们)来更新特定KEY的VALUES,但我还没找到提到改变KEY本身的方法。我已经找到了一种方法,通过执行类似于以下的操作来定位感兴趣的特定行:

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

任何建议都将不胜感激。谢谢你的帮助!

3 个答案:

答案 0 :(得分:3)

所以我继续前进并给它一张支票(因为它看起来应该有效,而且它或多或少是我最终做的),但我想出了我想要做的事情!我得到的是:

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

现在我考虑一下,我可能甚至不需要最后的条件,因为替换不会影响任何没有'b'的东西。但这对我有用,看起来你的应该也应该这样!谢谢您的帮助!

答案 1 :(得分:1)

我想重命名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'

答案 2 :(得分:0)

基本上,解决方案是遍历json_array_elements列表,并使用CASE条件基于json值将某个值替换为其他值。毕竟,需要使用array_agg()to_json()重新构建新的json数组,psql中的聚合函数描述为here。 可能的查询可以是:

-- 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;