当前位置: 首页 > 面试题库 >

PostgreSQL:从JSON列中删除属性

元鸿波
2023-03-14
问题内容

我需要从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从column中删除data

这样的东西alter table my_table drop column data->'attrB';会很好。但是使用临时表的方法也足够了。


问题答案:

更新 :对于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 after
FROM (VALUES ('{"attrA":1,"attrB":true,"attrC":["a","b","c"]}'::json)) AS v(data),
LATERAL (SELECT * FROM json_each(data) WHERE "key" <> 'attrB') AS l
GROUP BY data::text

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

编辑

一种更方便的形式是创建一个函数,该函数可以删除json字段中的任意数量的属性:

编辑2string_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
  STRICT
AS $function$
SELECT COALESCE(
  (SELECT ('{' || string_agg(to_json("key") || ':' || "value", ',') || '}')
   FROM json_each("json")
   WHERE "key" <> ALL ("keys_to_delete")),
  '{}'
)::json
$function$;

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

UPDATE my_table
SET data = json_object_delete_keys(data, 'attrB');


 类似资料:
  • 问题内容: 如果我有JSON对象,请说: 我可以删除“ key1”使其变为: 问题答案: 简单:

  • 要删除表的列,请在ALTER table语句中使用drop column子句,如下所示: 错误:“rs”行或其附近出现语法错误1:ALTER TABLE res_partner rs

  • 问题内容: 我有一个JSON: 我试图删除所有以 “ umb_” 开头的属性。这在json.net中可能吗? 输出将是这样的: 使用删除我能够做到,但是不能一次全部完成。 有什么建议吗? 问题答案: 您可以先解析字符串: 更新 或: 更新#2 您可以在子句中指定更多条件: 要么 或任何您需要的。

  • 问题内容: 我有课 它具有几个属性,可以说10。在这10个中,有3个填充了剩余的数据,其中7个是blank.ie空字符串“”使用此链接作为参考。我只想显示NON-NULL和NON- EMPTY字符串属性。但是最终输出具有所有10个属性。我只想看3。 } 我也尝试过 作为属性。没运气。我也这样 其中“ usr”是用户实例。运气不好,我的意思是,所有10个属性都返回“ t” 如您所见,仅填充了用户ID

  • 问题内容: 我有一张桌子。为了快速升级/部署网站,我做了一个新表,其中包含一些新数据,方法是: 现在每个表都有一个PK列,看起来像: 重要的一点是,两个表都依赖于完全相同的序列。没有。就我的目的而言,这似乎还可以。 此后,我加载了新数据并重命名了表,以便将其作为实盘接管,而原始表变成了。现在我尝试删除: 足够公平,列默认值仍取决于顺序。 这是踢脚线。 因此,不再对序列具有任何可见的依赖关系,但是它

  • 问题内容: 考虑2个或更多表: 我希望删除所有与名字“ Sam ”匹配的 用户 及其 订单 。在mysql中,我通常会做左连接。在此示例中,我们不知道userid。 查询的正确格式是什么? 问题答案: http://www.postgresql.org/docs/current/static/sql- delete.html 您也可以使用 http://www.postgresql.org/doc