【问题标题】:Remove a key:value from json string stored in a MySQL database从存储在 MySQL 数据库中的 json 字符串中删除 key:value
【发布时间】:2026-02-14 10:35:01
【问题描述】:

我在表格中有一列以格式存储:

{"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 的这个动态值,我被卡住了。

【问题讨论】:

  • 您需要使用正则表达式来实现这一点。见this post。但是,有些人似乎找到了解决方法。
  • 如果您使用 php,您可以迭代每一行并使用下面的代码来获取没有 field1 $str='{"field1":"val1","field2":"val4 的特定行"}'; $array = json_decode($str); foreach ($array as $key => $value) { if($key=="field1") continue;否则 echo "$key:$value
    "; }

标签: mysql sql mysql-json


【解决方案1】:

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

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

您还可以添加 WHERE 子句:

WHERE emp.col LIKE '%val6%';

参考文献: MySQL JSON_REMOVEMySQL JSON path

带有示例的博文: MySQL for your JSON

还有一个关于 MySQL 中 json 路径的说明:

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

【讨论】:

    【解决方案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
    

    【讨论】: