13

我在表中有一个列,它以以下格式存储:

{"field1":"val1","field2":"val4"}
{"field1":"val2","field2":"val5"}
{"field1":"val3","field2":"val6"}

我需要删除所有带有值的 field1(例如 "field1":"val1","field1":"val2","field1":"val3" ),结果应该是

{"field2":"val4"}
{"field2":"val5"}
{"field2":"val6"}

我试图通过替换来实现这一点,但卡在 '"field1":"val1"' 字符串 val1 可以是任何值,如 null、某个整数。

UPDATE emp SET col = REPLACE(col, '"field1":"val1"', '')

由于 val1 的动态值,我被卡住了。

4

2 回答 2

40

我更喜欢使用 JSON_REMOVE 函数(MySQL):

UPDATE emp
SET emp.col = JSON_REMOVE(emp.col, '$.field1');

您还可以添加 WHERE 子句:

WHERE emp.col LIKE '%val6%';

参考资料: MySQL JSON_REMOVEMySQL JSON 路径

带有示例的博客文章: 用于 JSON 的 MySQL

以及关于 MySQL 中 json 路径的注释:

如果属性标识符包含注释(空格、特殊字符、元字符),则路径中的属性名称必须用双引号引起来bugs.mysql.com

于 2017-07-10T21:18:14.623 回答
-2

你可以这样做:

SELECT SUBSTRING(Field, 1, INSTR(Field, '"field1"')) + SUBSTRING(Field, INSTR(Field, '"field2"'), LENGTH(Field)) FROM @Temp

我不知道这是否可行,但这就是想法。(无法测试 ATM)

这是 MsSQL 等效项(有效,刚刚测试!):

SELECT SUBSTRING(Field, 0, CHARINDEX('"field1"', Field)) + SUBSTRING(Field, CHARINDEX('"field2"', Field), LEN(Field)) FROM @Temp
于 2016-03-01T14:21:54.117 回答