如何从MySQL的JSON数组中删除一个数字?

时间:2016-11-08 23:01:35

标签: mysql mysql-5.7

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

3 个答案:

答案 0 :(得分:6)

我正在寻找自己的答案,并提出了这个问题,不想使用我继续搜索的对象。但是我找到了一个解决方案,您需要使用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结果
  4. 中删除路径

    Et瞧,您的价值已被删除。

    注意:这假定没有重复值

答案 1 :(得分:5)

在有人找到更好的解决方案之前,我只是将其转换为对象: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"');

获取具有特定数字的行:

public Dictionary<string, Dictionary<long, string>> getCustomFieldLists()
{
    return
        nsService.search(new CustomListSearch())
            .recordList.Select(a => (CustomList) a)
            .ToDictionary(a => a.internalId,
                a => a.customValueList.customValue
                     .ToDictionary(b => b.valueId, c => c.value));
}

var valueLookup = getCustomFieldLists();

var results = searchResults.Select(a => new
{
    Z = (a.basic.customFieldList.Where(b => b.scriptId == "custentityZ")
        .Select(a => (SearchColumnSelectCustomField)a)
        .Select(a => valueLookup[a.searchValue.typeId][a.searchValue.internalId])
        .First()
}

答案 2 :(得分:0)

顺便说一句,

 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