如何使用where子句从存储在PostgreSQL中jsonb列类型的JSON数组中修改或删除特定的JSON对象?

2024-04-20

在我的 Postgres 数据库中,我有一个具有 jsonb 数据类型的表列。在该列中,我存储 JSON 数组。现在,我想删除或修改数组内的特定 JSON 对象。

我的 JSON 数组看起来像

[
    {
        "ModuleId": 1,
        "ModuleName": "XYZ"
    },
    {
        "ModuleId": 2,
        "ModuleName": "ABC"
    }
]

现在,我想执行两个操作:

  1. 如何从上面 ModuleId 为 1 的数组中删除 JSON 对象?
  2. 如何修改 JSON 对象,即将 ModuleName 更改为 ModuleId 为 1 的“CBA”?

有没有一种方法可以直接对 JSON 数组执行查询?

注意:Postgres版本是12.0


这两个问题都需要取消嵌套并聚合回(修改后的)JSON 元素。对于这两个问题,我将创建一个函数以使其更易于使用。

create function remove_element(p_value jsonb, p_to_remove jsonb)
  returns jsonb
as
$$
  select jsonb_agg(t.element order by t.idx)  
  from jsonb_array_elements(p_value) with ordinality as t(element, idx)
  where not t.element @> p_to_remove;
$$
language sql
immutable;

该函数可以像这样使用,例如在 UPDATE 语句中:

update the_table
  set the_column = remove_element(the_column, '{"ModuleId": 1}')
where ...

对于第二个问题,类似的函数会派上用场。

create function change_value(p_value jsonb, p_what jsonb, p_new jsonb)
  returns jsonb
as
$$
  select jsonb_agg(
         case
           when t.element @> p_what then t.element||p_new
           else t.element
         end order by t.idx)  
  from jsonb_array_elements(p_value) with ordinality as t(element, idx);
$$
language sql
immutable;

The ||运算符将覆盖现有密钥,因此这实际上会用新名称替换旧名称。

你可以这样使用它:

update the_table
  set the_column = change_value(the_column, '{"ModuleId": 1}', '{"ModuleName": "CBA"}')
where ...;

我认为传递 JSON 值比硬编码键更灵活,这使得该函数的使用非常有限。第一个函数还可以用于通过比较多个键来删除数组元素。


如果您不想创建函数,请将函数调用替换为select从功能上看。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用where子句从存储在PostgreSQL中jsonb列类型的JSON数组中修改或删除特定的JSON对象? 的相关文章

  • Postgis安装:类型“几何”不存在

    我正在尝试使用 Postgis 创建表 我按这个做page http postgis refractions net documentation manual 1 5 ch02 html id2619431 但是当我导入 postgis s
  • 如何在ubuntu中从源代码安装postgresql的AGE扩展? [关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 由于我想尝试一下 Apache Age of postgresql 所以在阅读文档时我迷失了方向 有什么简单的解决方案吗 这是有关如何
  • Postgres 在并发更新插入时出现死锁

    我们有一个从数据流中读取信息并将该信息更新到数据库中的应用程序 数据是 Google Drive 上发生的变化 这意味着影响相同对象的许多事件可能会非常接近地发生 将此信息更新插入数据库时 我们遇到了死锁 日志中显示的内容如下 我已经重建并
  • Postgres 重叠数组中的一列

    我有一个表 A 其中有一列 col1 其中每个记录都是整数数组 col1 1 2 3 4 1 2 6 7 1 2 3 8 9 我喜欢有一行作为结果 其中包含 col1 中所有数组的重叠或相交 select overlap col1 from
  • PostgreSQL - 具有局部变量的函数 - 列引用不明确

    我查看了与我的主题相匹配的其他问题 但就我而言 我认为歧义来自于与列同名的变量 这是我尝试创建的函数的简化版本 CREATE OR REPLACE FUNCTION get user id username TEXT RETURNS INT
  • “psycopg2 的构建轮子失败” - 使用 virtualenv 和 pip 的 MacOSX

    我第一次尝试与其他几个人一起制作一个网站 在尝试使用 Django Python VirtualEnv 时遇到了一个奇怪的错误 我已经找到了针对其他操作系统 例如 Ubuntu 的此问题的解决方案 但找不到针对 Mac 的任何好的解决方案
  • 如果数组重叠,则折叠多行数组

    我在 PostgreSQL 9 3 中有一个表 其中包含一个列 每行包含一个数组 我正在努力寻找崩溃的方法 共享相同元素的数组行 Examples 简单重叠 给定以下两行数组 1 2 3 5 3 6 9 结果将是一行包含 5 1 2 3 6
  • 更改 IdentityServer4 实体框架表名称

    我正在尝试更改由 IdentityServer4 的 PersistedGrantDb 和 ConfigurationDb 创建的默认表名称 并让实体框架生成正确的 SQL 例如 而不是使用实体IdentityServer4 EntityF
  • 查找一列中具有相同值而另一列中具有其他值的行?

    我有一个 PostgreSQL 数据库 将用户存储在users他们参与的表格和对话conversation桌子 由于每个用户可以参与多个对话 并且每个对话可以涉及多个用户 因此我有一个conversation user链接表来跟踪哪些用户正
  • 如何在维护数据的同时升级 docker 容器中的 postgres? 10.3 到最新的 10.x 或 12.x

    我的生产和本地主机中有一个 10 3 postgres docker 容器 在之前的一个question https stackoverflow com a 62789347 80353 我必须恢复在 10 5 中存档的转储 感谢您的回答
  • 将enable_nestloop设置为OFF有哪些陷阱

    当我的表中有大量行时 我的应用程序中有一个查询运行得非常快 但是 当行数适中 既不大也不小 时 相同的查询运行速度会慢 15 倍 解释计划显示对中等规模数据集的查询正在使用嵌套循环其连接算法 大数据集使用散列连接 我可以阻止查询规划器在数据
  • 用户非超级管理员和大对象的 pg_dump

    我与非超级管理员的用户开始了导出数据库的长期职业生涯 但我发现了一个问题 在新版本的postgresql中只有超级管理员才能访问大对象 ERROR permission denied for large object 5141 没有办法做到
  • 使用 pg-promise 进行多行插入

    我想用一个插入多行INSERT查询 例如 INSERT INTO tmp col a col b VALUES a1 b1 a2 b2 有没有一种方法可以轻松地做到这一点 最好是对于像这样的对象数组 col a a1 col b b1 co
  • 使用登录名(用户)创建 PostgreSQL 9 角色只是为了执行函数

    我多年来一直在寻找这个 并且尝试了网络上的所有方法但没有成功 我可以在 MSSQL 中做到这一点 但我没有找到在 PostgreSQL 中做到这一点的方法 我想要实现的只是创建一个具有登录名的角色 该角色无法创建 删除或更改数据库 函数 表
  • Alembic 无法识别 False 默认值

    在维护 SQLAlchemy 数据模型并利用 alembic 进行版本控制时 我所做的以下代码更改导致了空修订 some column Column Boolean nullable False default False 以前是 some
  • 查询 Postgres 9.6 JSONB 对象数组

    我有下表 CREATE TABLE trip id SERIAL PRIMARY KEY gps data json jsonb NOT NULL gps data json 中的 JSON 包含一个行程对象数组 其中包含以下字段 示例数据
  • 哪种 SQL 模式能够更快地避免插入重复行?

    我知道有两种不重复插入的方法 第一个是使用WHERE NOT EXISTS clause INSERT INTO table name col1 col2 col3 SELECT s s s WHERE NOT EXISTS SELECT
  • 设置约束可延迟在 PostgreSQL 事务上不起作用

    情况是这样的 我有两个表 其中一个引用另一个 例如 table2 引用 table1 创建这些表时 我确实将外键约束设置为 DEFERRABLE 将 ON UPDATE 和 ON DELETE 子句设置为 NO ACTION 这是默认值 但
  • 如何使用 libpq 获取双精度值?

    The examples http www postgresql org docs 9 3 interactive libpq example htmllibpq 文档中展示了如何通过将整数值转换为主机字节序表示来获取整数值 我很好奇必须做
  • Postgres 运行缓慢的删除查询

    我们有一个表 其行数刚刚超过 62k 我们正在对其运行一个非常简单的删除查询 需要 45 分钟才能完成 DELETE FROM myTable WHERE createdtime lt 2017 03 07 05 00 00 000 我们尝

随机推荐

  • 为什么分配给多个目标(标识符/属性)会产生奇怪的结果?

    我有一些这样的代码 def foo bar initial bar Bar while True next bar Bar bar next bar next bar bar next bar return initial bar 其目的是
  • 具有 Room 和状态处理功能的 Kotlin 协程流

    我正在尝试新的协程流程 我的目标是创建一个简单的存储库 可以从 Web api 获取数据并将其保存到数据库 还可以从数据库返回流程 我使用 room 和 firebase 作为 Web api 现在一切看起来都非常简单 直到我尝试将来自 a
  • OCaml:用消息断言

    又是另一个问题 P 我不太确定是否应该将其发布在这里或 OCaml 邮件列表上 但我首先尝试这样做 我喜欢断言语句 然而 我发现如果没有附加消息 错误消息几乎毫无用处 第 XXX 行的断言冲突 很好 但实际上出了什么问题 我认为断言的一个很
  • 在 Javascript 中迭代数组

    我是一个 JavaScript 新手 我正在尝试练习一些示例 JavaScript 问题 当涉及到迭代数组的问题时 我有点困惑 有人能指出我正确的方向吗 我正在尝试接受价值观oldArray 分别添加 5 并存储在newArray var
  • Windows Phone 7 上的 Dispatcher.Invoke()?

    在回调方法中 我尝试获取文本框的文本属性 如下所示 string postData tbSendBox Text 但因为它不是在 UI 线程上执行 所以它给了我一个跨线程异常 我想要这样的东西 Dispatcher BeginInvoke
  • 从 powershell 脚本引用 .Net .dll

    您能帮我从 powershell 脚本引用 Net dll 吗 我正在使用 powershell ISE 编写 调试脚本 我有一些引用 Nuget 包的 net 代码 我想将该代码嵌入到 powershell 脚本中 如果我在 C WIND
  • 创建片段时的NPE

    我正在创建一个关于Fragment with sensorEventlitener 主要活动主办fragment如下代码所示 但在运行时我收到下面发布的内容logcat Errors 主要活动 public class MainActivi
  • 用于查找应用于特定分支的标签的命令

    用于查找应用于特定分支的标签的命令 假设我有一个名为 BR test 的分支名称 我想知道该分支上应用的所有标签是什么 如果这是 UCM 一个简单的lsbl就足够了 cleartool lsbl stream myStream mypvob
  • Django 的内存错误

    我有一个 Django 应用程序 它将大量数据加载到 sqlite3 数据库文件中 我们正在谈论数百万个条目 这些条目输入到一个函数中 在执行的某个时刻会抛出异常 File root codebase lib python2 6 site
  • 从单例类中检索 Ruby 对象?

    可以访问单例类 https ruby doc org core 2 5 1 Object html来自 Ruby 对象 some object singleton class 是否可以进行相反的操作 在单例类中访问原始对象 class lt
  • 找不到 com.google.android.gms:play-services:7.3.0

    我有来自 Android Studio gradle 的日志 Error A problem occurred configuring project ParseStarterProject gt Could not resolve all
  • 返回对象中项目总数的最佳 RESTful 方法是什么?

    我正在为我参与的一个大型社交网站开发 REST API 服务 到目前为止 它运行良好 我可以发出GET POST PUT and DELETE请求对象 URL 并影响我的数据 但是 此数据是分页的 一次限制为 30 个结果 通过我的 API
  • 使用 php 缩短 if else 语句

    我有一个关于缩短 if else 语句的问题 我正在尝试使用制作天气应用程序打开天气地图 https openweathermap org weather conditionsAPI 但我不喜欢那些图标 我想像这样更改图标 if desc
  • 如何在 Android 上显示当前可见活动的对话框?

    我的问题类似于这个2年前的问题 https stackoverflow com questions 3136187 how to detect if any of my activity is front most and visible
  • lib 未指定 & loadNamespace 中出现错误

    我的一切都可以使用 R 和 RStudio 但后来我在清理计算机目录和文件时移动了文件夹 现在我收到以下错误消息 R和RStudio应该安装在Program Files or Program Files x86 我应该有两个libPaths
  • 如何爆炸空间分隔的柱子?

    我在 Spark Scala 中有一个示例数据框 其中包含一列和许多其他列 50 并且需要分解 id 示例数据 id name address 234 435 567 auh aus 345 123 muji uk 输出数据 id name
  • MySQL 的 COUNT 运行总计

    我知道set running sum 0 running sum running sum 方法 但是 它似乎不适用于我的情况 我的查询 SELECT DISTINCT date COUNT AS count FROM table1 WHER
  • 如何知道我的项目上运行的是哪个版本的 PyMongo

    我正在开发一个python项目 在需求文件中我有三种不同类型的PyMongo Flask PyMongo 0 3 1 pymongo 2 7 flask mongoengine 0 7 1 如何定义我正在使用哪个版本 如果你有pip安装后
  • 从 Android 打印到 AirPrint 打印机 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 有谁听说过有人在 Android 上
  • 如何使用where子句从存储在PostgreSQL中jsonb列类型的JSON数组中修改或删除特定的JSON对象?

    在我的 Postgres 数据库中 我有一个具有 jsonb 数据类型的表列 在该列中 我存储 JSON 数组 现在 我想删除或修改数组内的特定 JSON 对象 我的 JSON 数组看起来像 ModuleId 1 ModuleName XY