更新并替换未加引号的 JSON 字符串
Update and replace unquoted JSON strings
我的数据库中有以下 table:
Type | Name
-------------------------------------------------
INT(10) UNSIGNED | id
LONGTEXT | 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
这是假设json字符串中的字符之间没有空格,简单但需要为此验证数据。
update tablename
set settings = replace(settings, '"value\":' , '"value":\"')
where settings not like '%"value":"%'
update tablename
set settings = replace(settings, ',"' , '","')
where settings not like '%","%'
我的数据库中有以下 table:
Type | Name
-------------------------------------------------
INT(10) UNSIGNED | id
LONGTEXT | 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
这是假设json字符串中的字符之间没有空格,简单但需要为此验证数据。
update tablename
set settings = replace(settings, '"value\":' , '"value":\"')
where settings not like '%"value":"%'
update tablename
set settings = replace(settings, ',"' , '","')
where settings not like '%","%'