在SQL中以JSON设置的形式基于唯一ID合并行

时间:2019-04-11 16:27:53

标签: sql json sql-server mysqli

我有一张桌子,我想根据通用ID合并行

ID     file_id   quantity

3       1122       25
3       1123        3
4       1126        7
4       1127        1

我想得到

ID     file_quantity_merged

3       {["file_id":1122, "quantity": 25],["file_id":1123, "quantity": 3]}
4       {["file_id":1126, "quantity": 7],["file_id":1127, "quantity": 1]}

我没有添加任何尝试的代码,因为我不确定sql server是否具有这样的方法来动态创建json,例如SET @json,因为我有大文件。 任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:2)

您想要的结果不是有效的JSON。

您需要一个对象数组,而不是用大括号括起来的逗号分隔数组列表。

只要您使用支持FOR JSON AUTO的版本,就可以使用

SELECT   ID,
         ( SELECT file_id, quantity
           FROM    YourTable T2
           WHERE   T2.ID = T1.ID FOR JSON AUTO ) AS file_quantity_merged
FROM     YourTable T1
GROUP BY ID

返回哪个

+----+----------------------------------------------------------------+
| ID |                      file_quantity_merged                      |
+----+----------------------------------------------------------------+
|  3 | [{"file_id":1122,"quantity":25},{"file_id":1123,"quantity":3}] |
|  4 | [{"file_id":1126,"quantity":7},{"file_id":1127,"quantity":1}]  |
+----+----------------------------------------------------------------+

答案 1 :(得分:1)

除了以上答案外,我还在不支持json的旧版本中尝试过,我们可能会使用group_concat方法在MySQL中处理此类情况:-

SELECT  ID, GROUP_CONCAT(`file_id`, ':',
    `quantity` SEPARATOR ', ') as file_quantity_merged
    from TABLE_NAME GROUP BY id;

Output:-

ID     file_quantity_merged
3      "1122:25, 1123:3"
4      "1126:7, 1127:1"