【问题标题】:JSON_REMOVE object in MySQLMySQL 中的 JSON_REMOVE 对象
【发布时间】:2019-05-07 11:58:41
【问题描述】:

我正在尝试从 MySQL 中的 JSON 数组中删除对象。

我有一个名为 cart 的表,其中包含两个字段 quote_id 类型 intitems 类型 json 并在 MySQL 中存储以下行

quote_id: 0

项目:

[ { "a":42, "b":"test4" }, { "a":32, "b":"test3" } ]

我正在尝试创建一个查询,该查询将从 json 数组中删除 json 对象。例如每个 { "a":32, "b":"test3" }

我尝试了很多查询。首先我得到了这个:

UPDATE cart
SET items = IFNULL(JSON_REMOVE(items, JSON_UNQUOTE(JSON_SEARCH(items, 'one', 'test3'))), items)
WHERE quote_id = 13392;

但是它只是从第二个对象中删除了 "b":"test3" 并将 "a":32 留在了其中,我需要一个可以找到整个对象并将其删除的查询。

这是我的第二个查询:

UPDATE cart
SET items = IFNULL(JSON_REMOVE(items, JSON_SEARCH(items, 'one', CAST('{"a": 32, "b": "test3"}' AS JSON))), items)
WHERE quote_id = 13392;

但是我认为对其进行的搜索不起作用。我在不使用 CAST()AS JSON 的情况下尝试了它,但它仍然不起作用。

正如我所说,我很确定问题出在JSON_SEARCH,但也许有人有解决方案?

谢谢!

【问题讨论】:

  • 你的那个字段的数据类型是什么?
  • 哪一个,信息?这是 JSON。

标签: mysql arrays json


【解决方案1】:

JSON_SEARCH 返回属性的路径,而不是对象本身的路径。

所以你可以使用下面的解决方案来获取带有SUBSTR的对象路径:

SELECT JSON_REMOVE(items, 
    SUBSTR(JSON_UNQUOTE(JSON_SEARCH(items, 'one', 'test3')), 1, LOCATE('.', JSON_UNQUOTE(JSON_SEARCH(items, 'one', 'test3')))-1)
) FROM cart

也可以使用REGEXP_SUBSTR获取对象路径:

SELECT JSON_REMOVE(items, REGEXP_SUBSTR(JSON_UNQUOTE(JSON_SEARCH(items, 'one', 'test3')), '^\\$\\[[0-9]+\\]'))
FROM cart

demo on dbfiddle.uk

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2019-11-25
    • 2020-09-12
    • 1970-01-01
    相关资源
    最近更新 更多