MySQL 更新数组中的特定 JSON 对象

2023-12-07

我正在努力寻找一种方法来更新 MySQL 中 JSON 类型字段中数组中的特定 JSON 对象。假设我有以下对象:

SET @j = '{
 "cat": "meow", 
 "dog": "woof", 
 "parrot": [
   {"volume": "quiet", "says": "hello"}, 
   {"volume": "loud", "says": "polly"},
   {"volume": "loud", "says": "cracker"}
  ]
}';

我怎样才能更新所有对象parrot其体积值为loud?

我知道如果对象的位置已知,我可以使用 JSON_SET 或 JSON_REPLACE 函数来更改/更新特定对象。例如:

UPDATE T1 SET @J = JSON_SET(@j, '$.parrot[1].says', 'pretty bird');

但是我不知道对象的位置,而且这也不会更新所有对象parrot其体积值为loud?

有什么建议么?


一种选择:

DROP PROCEDURE IF EXISTS `sp_update_json`;

DELIMITER //

CREATE PROCEDURE `sp_update_json`(
  `json` JSON,
  `value` VARCHAR(255)
)
BEGIN
  DECLARE `array_objects` JSON DEFAULT
    REPLACE(JSON_SEARCH(`json`,
                'all',
                'loud',
                NULL,
                '$.parrot[*].volume'
               ), 'volume', 'says');
  DECLARE `max_objects` INT UNSIGNED DEFAULT 
    JSON_LENGTH(`array_objects`);
  DECLARE `current_object` INT UNSIGNED DEFAULT 0;
  WHILE `current_object` < `max_objects` DO
    SET `json` := JSON_REPLACE(`json`, 
                           JSON_UNQUOTE(                             
                             JSON_EXTRACT(
                               `array_objects`,
                               CONCAT('$[', `current_object`, ']')
                             )
                           ), `value`);
    SET `current_object` := `current_object` + 1;
  END WHILE;
  SELECT `json`;
END//

DELIMITER ;

SET @`j` := '
{
  "cat": "meow", 
  "dog": "woof", 
  "parrot": [
    {"volume": "quiet", "says": "hello"}, 
    {"volume": "loud", "says": "polly"},
    {"volume": "loud", "says": "cracker"}
  ]
}';

CALL `sp_update_json`(@`j`, 'pretty bird');

See 数据库小提琴.

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

MySQL 更新数组中的特定 JSON 对象 的相关文章

随机推荐

  • 在 JavaScript 中更改输入值并提交表单

    我目前正在制作一个基本表格 当您点击提交按钮时 它应该首先更改字段的值 然后像平常一样提交表单 一切看起来有点像这样
  • Jetty SslConnector 已弃用的方法

    SslConnector java最新的 Jetty 中的界面已更改7 3 1 v20110307 几乎所有方法都已被标记为已弃用 而没有提及要使用的替换接口或方法 我已经检查过码头用户 and 码头开发邮件列表中的信息没有运气 有谁知道将
  • Zend_Form:带有复选框的 HTML 表中的数据库记录

    我正在尝试将 HTML 多列表添加到 Zend Form 该表将由数据库中的数据填充 并且每行前面应有一个复选框 如下面的 ASCII 所示 Column 1 Column 2 Column 3 x Row 1 Some data more
  • 如何将 Drawable 资源写入文件?

    我需要出口一些Drawable资源到文件 例如 我有一个函数返回给我一个Drawable目的 我想把它写到一个文件中 sdcard drawable newfile png 我该怎么做 尽管这里的最佳答案有一个很好的方法 这只是链接 以下是
  • 向 Netbeans 应用程序的基于 Inno 的设置添加其他文件

    我在用Inno 5 设置安装程序位于Netbeans将我的 Java Swing 应用程序构建为可执行设置文件 它创建一个包含所有 lib 所有 jar 文件 和 app jar 的 app exe 安装文件 因此 一旦用户执行 app e
  • 纠结于如何使用 api 响应进行调用以从不同的链接检索响应

    我目前在使用 PokeApi 时遇到问题 我有代码可以让我查看 Pokemon 的名称以及 Pokemon 的其他 JSON 的 URL 但我不太确定如何检索该数据 这是我到目前为止所拥有的 这是 api 的链接 让 pokeList im
  • 使用 Gmail SMTP 发送电子邮件时出错

    我正在尝试使用 Gmail SMTP 发送电子邮件PHPmailer 问题是我有这个错误 SMTP gt ERROR Failed to connect to server php network getaddresses getaddri
  • 使用正则表达式以任意顺序排列多个单词[重复]

    这个问题在这里已经有答案了 正如标题所说 我需要在句子中找到两个特定的单词 但它们可以是任何顺序和任何大小写 我该如何使用正则表达式来做到这一点 例如 我需要提取单词test and long从下面的句子中是否该词test首先出现或long
  • Linq2SQL:更新对象未在数据上下文中创建

    通常 当您在 linq2sql 中更新对象时 您会从数据上下文中获取该对象并使用相同的数据上下文来保存该对象 对吧 更新尚未由用于执行保存操作的数据上下文检索的对象的最佳方法是什么 即我使用Florinefx在flex和asp net之间传
  • 错误代码 1005,SQL 状态 HY000:无法创建表 errno:150

    我正在尝试创建一个表 但是当我的 netbeans 出错数据库的第一个表时 脚本就会失败 如何解决这个问题 CREATE TABLE filmy Film Id int NOT NULL Nazwa varchar 250 Adres va
  • HttpModule 仅在特定 MVC 路由上

    我有一个习惯IHttpModule我只想在特定路线上工作 例如 http example com HandleAzureTask 我希望这个模块只能在 HandleAzureTask route 由于这不是控制器 我无法真正设置 Autho
  • UINavigationBar 旋转和自动布局

    关于通过将 UINavigationBar 插入场景来设计自己的视图控制器 我发现了许多关于旋转设备时框架高度如何不改变的问题的参考 这与 Apple 在其导航控制器中使用 UINavigationBar 的方式形成鲜明对比 其中导航栏的高
  • 如何在 Easy Slider 1.7 中重新启动滑动动画

    我有一个关于 jQuery Easy Slider 1 7 的问题http cssglobe com post 5780 easy slider 17 numeric navigation jquery slider带有数字导航 当我使用滑
  • R线性回归公式中的大写字母“I”是什么意思?

    我一直无法找到这个问题的答案 主要是因为谷歌搜索带有独立字母 如 I 的任何内容都会导致问题 我 在这样的模型中做什么 data rock lm area I peri mean peri data rock 考虑到以下方法不起作用 lm
  • 用于匹配包含点的整个单词的正则表达式

    在下面的句子中 我下午 5 点就醒了 今天 我想匹配5 p m 该模式的工作原理 5 p m 但我希望它只匹配整个单词 所以下午 5 点不会匹配 所以我使用了这个模式 b5 p m b 但由于点的原因 这不起作用 解决这个问题最简单的正则表
  • 如何从git暂存区删除文件?

    我对本地存储库中的一些文件进行了更改 然后我做了git add A我认为向暂存区域添加了太多文件 如何删除暂存区中的所有文件 完成后 我将手动执行git add filename 您可以使用以下命令从索引中取消暂存文件 git reset
  • 如何比较android中的字符串大于

    我想知道是否有一种方法可以将android中的字符串与大于或 gt 进行比较 可以说我有这个 String numbers number getText toString if numbers equals 9 output setText
  • Google Oauth 给出代码兑换错误

    您好 我正在开发一个用户通过谷歌帐户登录的项目 本地主机 我已经实现了谷歌注册 当我从我的帐户登录时 我收到以下错误 TokenError Code was already redeemed at Strategy OAuth2Strate
  • 如何将参数传递给导航控制器内的弹出视图控制器

    我有一个带有分割视图的 iPad 应用程序 并且详细视图控制器的导航栏中有一个右栏按钮 该按钮调用由导航控制器和两个表视图组成的弹出窗口 如下图所示 由于故事板在图片上很小 我添加了一些解释 白色控制器是detailViewControll
  • MySQL 更新数组中的特定 JSON 对象

    我正在努力寻找一种方法来更新 MySQL 中 JSON 类型字段中数组中的特定 JSON 对象 假设我有以下对象 SET j cat meow dog woof parrot volume quiet says hello volume l