假设存储在 MySQL 数据类型中的以下 JSON json:
"users": [
{
"group": "manager",
"userID": "a123"
},
{
"group": "employee",
"userID": "a456"
}
]
Run Code Online (Sandbox Code Playgroud)
如何在"userID": "a456"不知道用户对象在数组中的位置的情况下删除它?
如果我们知道位置,那么可以进行以下操作:
$query = 'UPDATE jsontable SET
jsondata = JSON_REMOVE
(
jsondata,
"$.users[1]"
);';
Run Code Online (Sandbox Code Playgroud)
但是,我正在寻找的是这样的:
$query = 'UPDATE jsontable SET
jsondata = JSON_REMOVE
(
jsondata,
(
JSON_SEARCH
(
jsondata,
"all",
JSON_OBJECT("userID", "a456")
)
)
);';
Run Code Online (Sandbox Code Playgroud)
以上会产生该列的数据截断错误jsondata。其他变体(例如直接输入用户 ID)也会JSON_OBJECT产生错误。
我需要在查询中修复什么才能返回JSON_SEARCH我想要从数组中删除的特定对象的路径?
请记住,它应该只在 内部进行搜索users,因为主 JSON 对象上可能还有使用这些 ID 的其他属性。
我认为这JSON_SEARCH对你有用。它应该为您返回路径。最后一个参数'$**.users'表示仅在名为的路径中搜索users
SELECT
JSON_SEARCH(jsondata, 'one', 'a456', null, '$**.users')
FROM jsontable
Run Code Online (Sandbox Code Playgroud)
在这里找到一个Dbfiddle JSON_SEARCH
更新
与 , 的组合语句JSON_REMOVE以及取消引用JSON_SEARCH 结果的JSON_SEARCH函数。REPLACE
UPDATE jsontable
SET jsondata = JSON_REMOVE(
jsondata, REPLACE(
JSON_SEARCH( jsondata, 'one', 'a456', null, '$**.users' )
, '"'
, ''
)
);
Run Code Online (Sandbox Code Playgroud)
附加信息:
| 归档时间: |
|
| 查看次数: |
4144 次 |
| 最近记录: |