1

我有以下数据表

在此处输入图像描述

我想做的是GROUP BY时间戳和JSON_MERGE对象。我期望的结果如下。

在此处输入图像描述

我希望以下查询能够正常工作,但我得到了一个错误

SELECT timestamp, JSON_MERGE(json)
FROM data
GROUP BY timestamp, JSON_MERGE(json)

我得到的错误是

对本机函数“JSON_MERGE”的调用中的参数计数不正确

4

1 回答 1

1

使用字符串函数组装所需的 JSON,然后将其转换为 JSON。

示例数据

create table data (json json, timestamp datetime);

insert into data values
('{"a": 1}', '2016-10-01 00:00:00'),
('{"b": 2}', '2016-10-01 00:00:00'),
('{"c": 3}', '2016-10-01 11:11:11'),
('{}', '2016-10-01 11:11:11'),
('{"c": 33}', '2016-10-01 11:11:11');

查询以合并json按时间戳分组的所有值

select cast(
  concat('{',  -- wrap everything in root object '{ ... }'
    group_concat(
      -- strip parenthesis from individual item representation
      -- '{"foo": 1}' -> '"foo": 1'
      substring(json, 2, length(json) - 2)),
  '}') as json) json,
timestamp
from data
-- skip empty JSON values to avoid getting extra comma during 
-- group_concat
where json != JSON_OBJECT()  
group by timestamp;

查询结果

+------------------+---------------------+
| json             | timestamp           |
|------------------+---------------------|
| {"a": 1, "b": 2} | 2016-10-01 00:00:00 |
| {"c": 3}         | 2016-10-01 11:11:11 |
+------------------+---------------------+

几个警告:

  • 此代码段的行为与 不同JSON_MERGE(),例如:
    • 当两个或多个属性具有相同名称时,它们的值将被覆盖而不是合并到值数组中
    • 它不能将对象与数组合并
  • 所提供的解决方案仅适用于作为顶级实体的对象,而不适用于数组。可以修改它以使用数组。
  • 如果依赖于以花括号开头和结尾的 JSON 对象的字符串表示{}。这可能会在服务器的未来版本中发生变化。
于 2017-02-17T11:15:36.960 回答