栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

PostgreSQL:从JSON列中删除属性

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

PostgreSQL:从JSON列中删除属性

更新 :对于9.5及更高版本,可以使用显式运算符

jsonb
(如果您有
json
类型化的列,则可以使用强制类型转换来应用修改):

可以使用

-
运算符从JSON对象(或数组)中删除键(或索引):

SELECt jsonb '{"a":1,"b":2}' - 'a', -- will yield jsonb '{"b":2}'       jsonb '["a",1,"b",2]' - 1    -- will yield jsonb '["a","b",2]'

可以使用

#-
运算符从JSON层次结构的深层删除:

SELECT '{"a":[null,{"b":[3.14]}]}' #- '{a,1,b,0}'-- will yield jsonb '{"a":[null,{"b":[]}]}'

对于9.4,您可以使用原始答案的修改版本(如下),但是您可以使用

json
直接将其聚合为一个对象,而不是聚合JSON字符串
json_object_agg()

相关:PostgreSQL中的其他JSON操作:

  • 如何修改新的PostgreSQL JSON数据类型内的字段?

原始答案 (适用于PostgreSQL 9.3):

如果您至少具有PostgreSQL 9.3,则可以将对象与成对拆分

json_each()
并过滤不想要的字段,然后再次手动构建json。就像是:

SELECT data::text::json AS before,       ('{' || array_to_string(array_agg(to_json(l.key) || ':' || l.value), ',') || '}')::json AS afterFROM (VALUES ('{"attrA":1,"attrB":true,"attrC":["a","b","c"]}'::json)) AS v(data),LATERAL (SELECt * FROM json_each(data) WHERe "key" <> 'attrB') AS lGROUP BY data::text

如果使用9.2(或更低),则不可能。

编辑

一种更方便的形式是创建一个函数,该函数可以删除

json
字段中的任意数量的属性:

编辑2

string_agg()
比便宜
array_to_string(array_agg())

CREATE OR REPLACe FUNCTION "json_object_delete_keys"("json" json, VARIADIC "keys_to_delete" TEXT[])  RETURNS json  LANGUAGE sql  IMMUTABLE  STRICTAS $function$SELECT COALESCE(  (SELECT ('{' || string_agg(to_json("key") || ':' || "value", ',') || '}')   FROM json_each("json")   WHERe "key" <> ALL ("keys_to_delete")),  '{}')::json$function$;

使用此功能,您所需要做的就是运行以下查询:

UPDATE my_tableSET data = json_object_delete_keys(data, 'attrB');


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/485548.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号