【问题标题】:How to remove an element from MySQL's JSON array inside an object?如何从对象内的 MySQL 的 JSON 数组中删除元素?
【发布时间】:2020-05-29 09:55:18
【问题描述】:

我有一个 mysql 表“tbl1”,其中包含一个 JSON 字段“数字”,其中包含如下值:

{ "开始" : ["101","102","104"], "最终" : ["102","105","106"] }

如何更新“数字”以从“开始”和“最终”中删除特定元素(即“102”)?

我知道我必须使用 JSON_REMOVE 和 JSON_SEARCH 的组合,但我没有找到解决方案。

【问题讨论】:

  • 不抱歉。我只想从属性值中删除一个元素,而不是所有属性。
  • 误读了您的问题,但这应该可以帮助您stackoverflow.com/questions/40497905/…
  • 你的 MySQL 版本是多少?
  • mysql Ver 14.14 Distrib 5.7.30
  • 我找到了这样一个查询的解决方案: update tbl1 set numbers = JSON_REMOVE(numbers, JSON_UNQUOTE(JSON_SEARCH(numbers, 'one', '102',NULL,'$.start')) ) 其中 JSON_SEARCH(numbers, 'one', '102',NULL,'$.start') 不为空;

标签: mysql


【解决方案1】:
WITH RECURSIVE
cte AS ( SELECT JSON_REMOVE(json_field, JSON_UNQUOTE(JSON_SEARCH(json_field, 'one', '102'))) json_field
         FROM source_table
         UNION ALL
         SELECT JSON_REMOVE(json_field, JSON_UNQUOTE(JSON_SEARCH(json_field, 'one', '102'))) json_field
         FROM cte
         WHERE JSON_SEARCH(json_field, 'one', '102') )
SELECT json_field
FROM cte
WHERE JSON_SEARCH(json_field, 'one', '102') IS NULL;

分别

UPDATE source_table
JOIN (  WITH RECURSIVE
        cte AS ( SELECT id, JSON_REMOVE(json_field, JSON_UNQUOTE(JSON_SEARCH(json_field, 'one', '102'))) json_field
                 FROM source_table
                 UNION ALL
                 SELECT id, JSON_REMOVE(json_field, JSON_UNQUOTE(JSON_SEARCH(json_field, 'one', '102'))) json_field
                 FROM cte
                 WHERE JSON_SEARCH(json_field, 'one', '102') )
        SELECT id, json_field
        FROM cte
        WHERE JSON_SEARCH(json_field, 'one', '102') IS NULL
     ) processed USING (id)
SET source_table.json_field = processed.json_field;

【讨论】:

    猜你喜欢
    • 2019-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-31
    • 1970-01-01
    • 2013-09-01
    相关资源
    最近更新 更多