Snowflake中Group By分组后如何将结果合并为JSON数组
按ID分组生成JSON数组解决方案
原表(table-1)
| id | value-1 | value-2 |
|---|---|---|
| id-1 | test | {"id": "value","other": "this"} |
| id-2 | foo-1 | {"id": "value","other": "this"} |
| id-2 | foo-2 | {"id": "value1","other": "this"} |
期望输出
| id | json_value |
|---|---|
| id-1 | [{"value-1": "test","value-2": {"id": "value","other": "this"}}] |
| id-2 | [{"value-1":"foo-1","value-2":{"id":"value","other":"this"}},{"value-1":"foo-2","value-2":{"id":"value1","other":"this"}}] |
各主流数据库实现代码
PostgreSQL
利用json_build_object构造单行JSON对象,json_agg聚合为数组:
SELECT id, json_agg( json_build_object( 'value-1', value_1, 'value-2', value_2::json ) ) AS json_value FROM table_1 GROUP BY id;
注:如果
value-2字段本身是JSON类型,去掉::json转换即可。
MySQL
用JSON_OBJECT生成单行JSON,JSON_ARRAYAGG直接聚合为JSON数组:
SELECT id, JSON_ARRAYAGG( JSON_OBJECT( 'value-1', value_1, 'value-2', value_2 ) ) AS json_value FROM table_1 GROUP BY id;
注:若
value-2是字符串类型且存储的是合法JSON,MySQL会自动识别;如果是普通字符串,需用JSON_QUOTE()包裹。
SQL Server
通过子查询生成单行JSON对象,再用STRING_AGG拼接成数组格式:
SELECT id, CONCAT('[', STRING_AGG(json_row, ','), ']') AS json_value FROM ( SELECT id, (SELECT value_1, value_2 FOR JSON PATH, WITHOUT_ARRAY_WRAPPER) AS json_row FROM table_1 ) t GROUP BY id;
内容的提问来源于stack exchange,提问作者hitesh
相关产品推荐
相关产品推荐

