JSON_MERGE_PRESERVE具有独特的附加功能

JSON_MERGE_PRESERVE with unique additions

提问人:Aloof aloof 提问时间:2/4/2023 最后编辑:Bill KarwinAloof aloof 更新时间:2/4/2023 访问量:199

问:

我在表中有一列,它是对象数组。对象的架构是常量的。

喜欢这个:

col = [{"a": "a_value_1", "b": "b_value_1"}, {"a": "a_value_2", "b": "b_value_2"} ...]

现在,我想通过附加新值来更新列值,仅当它们尚未存在于数组中时。

我知道可以使用进行更新,但它只是附加值而不检查它是否已经存在。我基本上想要一个 json 集而不是 json 数组。JSON_MERGE_PRESERVE

例如

JSON_MERGE_PRESERVE_VARIATION (col, {"a": "a_value_1", "b": "b_value_1"}) = col

mysql中是否存在这样的查询?另外,我们仍在 5.7 版上

mysql-json

评论

1赞 Barmar 2/4/2023
让你的生活更轻松,不要使用 JSON 数据类型。
0赞 Aloof aloof 2/4/2023
真的无法控制:/
0赞 Barmar 2/4/2023
也许我误解了这个问题。您要向数组中的对象添加什么?
0赞 Barmar 2/4/2023
用于测试对象是否已在数组中。如果没有,请添加它。JSON_SEARCH()
0赞 Bill Karwin 2/4/2023
或者使用 JSON 对象而不是 JSON 数组。JSON 对象是有效的集合,因为对象键是唯一的。但你可能会说你对此没有任何控制权。:-(

答:

0赞 TSCAmerica.com 2/4/2023 #1

我希望这会有所帮助

UPDATE table_name
SET col = JSON_ARRAY_APPEND(col, '$', JSON_OBJECT('a', 'a_value_3', 'b', 'b_value_3'))
WHERE NOT EXISTS (
    SELECT 1
    FROM JSON_TABLE(col, '$[*]' COLUMNS (
        a VARCHAR(50) PATH '$.a',
        b VARCHAR(50) PATH '$.b'
    )) temp
    WHERE temp.a = 'a_value_3' AND temp.b = 'b_value_3'
);

评论

0赞 Aloof aloof 2/7/2023
正如我在帖子中提到的,mysql版本是5.7。 仅在 MySQL 8 之后可用JSON_TABLE