【问题标题】:How to remove a number from MySQL's JSON array?如何从 MySQL 的 JSON 数组中删除一个数字?
【发布时间】:2017-03-22 17:28:43
【问题描述】:

如果我有一个 MySQL 表,其中包含一个名为 numbers 的 JSON 列,并且该列中包含 [1, 2, 3] 的记录(整数数组),我如何更新该记录以删除 2(所以它变成[1, 3])?

【问题讨论】:

  • 您想使用查询还是使用任何脚本语言(如 PHP 或 Python)来执行此操作
  • 用代码做这件事不是问题;我正在寻找一个仅限 sql 的解决方案,因为集合很大。

标签: mysql mysql-5.7


【解决方案1】:

在有人找到更好的解决方案之前,我只是将其转换为一个对象:{"1": 1, "2": 2, "3": 3}。是的,这更难看,占用更多磁盘空间,但您不必担心重复。

添加数字:

update tbl set numbers = json_insert(`numbers`, '$."4"', 4);

要删除一个数字:

update tbl set numbers = json_remove(`numbers`, '$."4"');

获取特定编号的行:

select * from tbl where json_contains_path(`numbers`, 'one', '$."4"');

【讨论】:

    【解决方案2】:

    我正在寻找自己的答案并来到这个问题,不想使用我继续搜索的对象。但是我找到了解决办法,你需要使用json_removejson_search的组合

    以下内容从表 tbl 和列 numbers 中删除值 1

    UPDATE tbl
    SET numbers = JSON_REMOVE(
      numbers, replace(json_search(numbers, 'one', 1), '"', '')
    )
    WHERE json_search(numbers, 'one', 1) IS NOT NULL
    
    1. json_search 返回值所在的路径,即。 "$[0]"
    2. replace 去掉" 否则json_remove 会出错
    3. json_remove 将从json_search 结果中删除路径

    等等,你的价值被删除了。

    注意:这里假定没有重复值

    【讨论】:

    • 不错。感谢您的贡献。
    • 请记住,如果您在数字中存储整数值 (bugs.mysql.com/bug.php?id=79316),JSON_SEARCH 将找不到整数。
    • 可以使用 JSON_UNQUOTE 代替替换 dev.mysql.com/doc/refman/5.7/en/…
    • @MKroeders 我也在考虑一种解决重复问题的方法。 json_search 可以返回一个包含所有匹配项的数组,json_remove 可以有 2-n 个要删除的路径参数。现在考虑如何将其写入将数组扩展为多个项目的位置...嗯...
    • @amaster 不知道直接的方法,经过一番测试。我认为使用重复(mysqltutorial.org/mysql-stored-procedure/mysql-repeat-loop)创建自己的函数,然后循环遍历它直到找不到密钥是你最安全的选择
    【解决方案3】:

    顺便说一句,

     JSON_SEARCH(json_doc, one_or_all, search_str[, escape_char[, path]
     ...])
    

    https://dev.mysql.com/doc/refman/8.0/en/json-search-functions.html#function_json-search

    只需 search_str

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-14
      • 1970-01-01
      • 2017-02-09
      • 1970-01-01
      • 1970-01-01
      • 2022-08-17
      • 1970-01-01
      • 2022-01-08
      相关资源
      最近更新 更多