首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用MySQL函数在JSON数组中按属性删除对象?

如何使用MySQL函数在JSON数组中按属性删除对象?
EN

Stack Overflow用户
提问于 2018-06-09 03:32:18
回答 1查看 2.3K关注 0票数 4

给定以下存储在MySQL json数据类型中的JSON:

代码语言:javascript
复制
"users": [
    {
        "group": "manager",
        "userID": "a123"
    },
    {
        "group": "employee",
        "userID": "a456"
    }
]

在不知道用户对象在数组中的位置的情况下,如何使用"userID": "a456"删除用户对象?

如果我们知道位置,那么下面的方法是可行的:

代码语言:javascript
复制
$query = 'UPDATE jsontable SET
jsondata = JSON_REMOVE
(
    jsondata, 
    "$.users[1]"
);';

然而,我正在寻找的东西是这样的:

代码语言:javascript
复制
$query = 'UPDATE jsontable SET
jsondata = JSON_REMOVE
(
    jsondata, 
    (
        JSON_SEARCH
        (
            jsondata, 
            "all",
            JSON_OBJECT("userID", "a456")
        )
    )
);';

上面的代码为jsondata列生成了一个数据截断错误。其他变体,如直接放置userID而不是JSON_OBJECT,也会产生错误。

我需要在查询中修复什么,才能让JSON_SEARCH返回我想要从数组中删除的特定对象的路径?

请记住,它应该只在users内部进行搜索,因为主JSON对象上可能有使用这些ID的其他属性。

EN

回答 1

Stack Overflow用户

发布于 2021-10-25 15:12:38

补充了Michael的答案。

为了删除双引号,他使用了REPLACE函数。

为此,我们可以使用JSON_UNQUOTE

此外,解决方案将不起作用,因为从JSON_SEARCH返回的路径将指向传递的搜索字符串。因此,它将从对象而不是对象中删除键值对。

因此,要删除完整的对象,我们必须获取json的前一个路径。

代码语言:javascript
复制
UPDATE jsontable
    SET jsondata = JSON_REMOVE( 
        jsondata, JSON_UNQUOTE(
            REPLACE( 
                JSON_SEARCH( jsondata, 'one', 'a456', null, '$**.users' )
                , '.userID'
                , ''
            )
        ) 
    );

因为我们需要以前的路径,所以我在这里硬编码它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50767317

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档