我需要从 json 类型列中删除一些属性。
桌子:
CREATE TABLE my_table( id VARCHAR(80), data json);
INSERT INTO my_table (id, data) VALUES (
'A',
'{"attrA":1,"attrB":true,"attrC":["a", "b", "c"]}'
);
现在,我需要从 attrB
data
。
像 alter table my_table drop column data->'attrB';
这样的东西会很好。但是使用临时表的方法也足够了。
原文由 sja 发布,翻译遵循 CC BY-SA 4.0 许可协议
更新:对于 9.5+,您可以将显式运算符与
jsonb
一起使用(如果您有json
类型的列,您可以使用强制转换来应用修改):可以使用
-
运算符从 JSON 对象(或从数组)中删除键(或索引):可以使用
#-
运算符从 JSON 层次结构的深处删除:对于 9.4,您可以使用原始答案的修改版本(如下),但您可以直接使用
json_object_agg()
聚合到json
对象中,而不是聚合 JSON 字符串。相关:PostgreSQL 中的其他 JSON 操作:
原始答案(适用于 PostgreSQL 9.3):
如果您至少有 PostgreSQL 9.3,您可以使用
json_each()
将对象分成对并过滤不需要的字段,然后再次手动构建 json。就像是:对于 9.2(或更低),这是不可能的。
编辑:
更方便的形式是创建一个函数,它可以删除
json
字段中的任意数量的属性:编辑2 :
string_agg()
比array_to_string(array_agg())
便宜使用此功能,您需要做的就是运行以下查询: