我正在使用一些本机JSON字段来存储有关MySQL 5.7.10数据库中某些应用程序实体的信息。我可以为每个“实体”设置“N”行,并且需要将JSON对象汇总并合并在一起,并且任何冲突的键都应该替换而不是合并。我可以通过代码来实现这一点,但如果我能在MySQL中本地有效地完成它,那就更好了。
我尝试使用GROUP_CONCAT
和JSON_MERGE的组合,但我遇到了两个问题:
GROUP_CONCAT
的结果作为有效参数当前的MySQL JSON实现是否可以实现?
答案 0 :(得分:0)
对于JSON值的聚合,SQL NULL值将与其他数据类型一样被忽略。除MIN(),MAX()和GROUP_CONCAT()外,非NULL值将转换为数字类型并进行聚合。转换为数字应该为数字标量的JSON值产生有意义的结果,尽管(取决于值)可能会发生截断和精度损失。转换为其他JSON值的数量可能不会产生有意义的结果。
我刚刚在mysql docs
中找到了这个答案 1 :(得分:0)
首先,GROUP_CONCAT只返回一个字符串,因此你必须强制转换它。其次,有一个函数正在执行你想要的JSON_MERGE_PATCH()。请尝试以下方法:
SELECT
JSON_MERGE_PATCH(
yourExistingJson,
CAST(
CONCAT(
'[',GROUP_CONCAT(myJson),']'
)
AS JSON)
) AS myJsonArray
....
刚刚意识到你的版本。您必须升级到5.7.22或更高版本。你的情况有可能吗?如果没有,可能还有其他方式,但它们不会优雅:(
答案 2 :(得分:0)
您可以执行以下操作:
SELECT
CAST(CONCAT(
'[',
GROUP_CONCAT(
DISTINCT JSON_OBJECT(
'foo', mytable.foo,
'bar', mytable.bar
)
),
']'
) AS JSON) AS myJsonArr
FROM mytable
GROUP BY mytable.someGroup;
答案 3 :(得分:0)
- JSON_MERGE不会将GROUP_CONCAT的结果作为有效参数
GROUP_CONCAT
给出a,b,c,d
,而不是JSON数组。使用JSON_ARRAYAGG
(在MySQL 5.7.22中引入),其工作原理与group_concat相似,但是给出了正确的数组["a", "b", "c", "d"]
,该数组应为JSON函数所接受。
在5.7.22之前,您需要使用变通方法:
cast(
concat('["', // begin bracket and quote
group_concat(`field` separator '", "'), // separator comma and quotes
'"]' // end quote and bracket
) as json
)
- JSON_MERGE合并有冲突的密钥,而不是替换它们。我真正需要的是更多的JSON_SET,但使用JSON文档的数量为“ N”而不是“键,值”表示法。
改为使用JSON_MERGE_PATCH
,如MySQL 5.7.22中所述。 JSON_MERGE
是JSON_MERGE_PRESERVE
的同义词。
请参见https://dev.mysql.com/doc/refman/5.7/en/json-function-reference.html。