You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用单条PostgreSQL语句移除JSONB数组中的指定字符串集合?

PostgreSQL JSONB字段移除指定数组元素的单条更新方案

直接用这条UPDATE语句就能完成需求,完美匹配你的三个限制:

UPDATE users
SET favorites = jsonb_set(
    favorites,
    '{shapes}',
    (
        SELECT jsonb_agg(elem)
        FROM jsonb_array_elements(favorites->'shapes') AS elem
        WHERE elem::text NOT IN ('"Square"', '"Circle"')
    )
);

关键细节说明:

  • 满足限制1:如果待移除的形状在某行的shapes里不存在,WHERE elem::text NOT IN (...)会自动跳过这些不存在的元素,只移除实际存在的项,不会影响其他元素。
  • 满足限制2:jsonb_set只会修改favorites里的shapes字段,对象中其他所有字段都会原封不动保留,完全不需要把整个JSONB对象转成数组。
  • 满足限制3:这就是单条查询,执行一次就能完成所有用户数据的更新。

动态移除列表的扩展写法

如果你的待移除形状列表是可变的(比如从变量传入),可以用<> ALL替代NOT IN,更灵活:

-- 假设待移除的形状列表是一个PostgreSQL文本数组
WITH to_remove AS (
    SELECT ARRAY['"Square"', '"Circle"']::text[] AS shapes
)
UPDATE users
SET favorites = jsonb_set(
    favorites,
    '{shapes}',
    (
        SELECT jsonb_agg(elem)
        FROM jsonb_array_elements(favorites->'shapes') AS elem, to_remove
        WHERE elem::text <> ALL(to_remove.shapes)
    )
);

内容的提问来源于stack exchange,提问作者Berry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 01:07:30