如何更新存储在PostgreSQL文本字段中的json数据?

时间:2018-12-14 03:09:27

标签: json postgresql

我有一个表services,其中有一个名为properties的列,其类型为text

json列中存储着properties数据。

我可以像这样用json查询psql数据:

SELECT * FROM services WHERE properties::json->>'url' = 'www.example.com';

但是我无法使用以下查询更新json数据:

UPDATE 
   services SET properties::json->>'url' = 'www.mydomain.com' 
WHERE 
   properties::json->>'url' = 'www.example.com';

上面的UPDATE命令生成错误:

ERROR:  syntax error at or near "::"
LINE 1: UPDATE services SET properties::json->>'url' = 'www.....

如何更新url列内的properties字段?

我的UPDATE命令出了什么问题?

2 个答案:

答案 0 :(得分:2)

您应该将记录存储为JSON而不是TEXT,这样就不必在所有地方都进行类型转换。

如果您运行的是Postgres 9.5+,则可以使用jsonb_set

UPDATE 
   services SET properties = jsonb_set(properties::jsonb,
                 '{url}' , '"www.mydomain.com"' )::text
WHERE 
   properties::json->>'url' = 'www.example.com';

Demo

答案 1 :(得分:0)

我不知道您的JSON的结构,所以我使用我的样本。

您可以使用REPLACE函数将REPLACE的字符串exampledomain一起使用,然后转换为JSON,但最好更改{ {1}}键入列propertiestext

REPLACE定义

  

将子字符串中的所有匹配项都替换为

json

您可以在这里Demo