我的数据库中有下表:

              Type | Name
-------------------------------------------------
  INT(10) UNSIGNED | id
          LONGTEXT | settings

settings列包含JSON字符串,如下所示:

'[
    {"value":"1","label":"user_type"},
    {"value":"2","label":"email_type"}
]'

我有一些损坏的数据,这些数据与要求的格式不一致,因为要求现在已更改.

'[
    {"value": 8,"label":"should_receive_notifications"},
]'

请注意,与第一个示例相比,该值是如何没有引号的,这就是我需要它们的方式.

有没有一种方法可以在设置列中对所有JSON字符串进行查找和替换,以更新JSON字符串中所有未加引号的值,并将它们用引号括起来?

推荐答案

您可以使用下一步骤:

CREATE PROCEDURE quote_value(max_amount INT)
BEGIN
REPEAT
    UPDATE test
    SET settings = JSON_REPLACE(settings, CONCAT('$[', max_amount, '].value'), CAST(JSON_UNQUOTE(JSON_EXTRACT(settings, CONCAT('$[', max_amount, '].value'))) AS CHAR));
    SET max_amount = max_amount - 1;
UNTIL max_amount < 0 END REPEAT;
END

max_amount参数定义要更新的数组中对象的数量(不要忘记数组元素从零开始计数).因此,将其设置为"每数组最大对象数量"值.

https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=166f43d44e57b62da034bd9530713beb

Mysql相关问答推荐

MySQL有没有办法直接从CSV文件中读取而不是导入它?

了解MySQL_stmt_BIND_NAMED_Param()-MySQL C API

如何防止程序中计数器出错

计算符合字段值只能包含一种事件类型这一事实的记录

根据 MySql 中同一表中的多列 Select 多列

是否可以使用以EXPLAIN EXTENDED ...开头的 SQL 语句修改数据?

MySQL:根据条件查找某些用户的行位置

MySQL 使用了错误的索引

如何 Select 具有最新的 2 个日期字段的行?

使用另一个表中的值更新一个表中的值

MySQL 1292 截断不正确的日期时间值:'2020-09-11T08:32-50Z'

MySQL 中的 LATERAL 语法 - 是否只是说左表首先执行以便下一个可以引用它?

在 SQL 中将列添加为 End_date,间隔为 +100 天

用数字和字母对 VARCHAR 列进行排序

结果差异(MySQL 5.7 vs MySQL 8.0)

减少mysql中的值但不是负数

MySql 以秒为单位的两个时间戳之间的差异?

MySQL - 如何 Select 值在数组中的行?

如何通过一个查询批量更新 mysql 数据?

数据截断:第 1 行的logo列数据太长