Объединение строк на основе уникального идентификатора в форме набора JSON в SQL

#sql #json #sql-server

#sql #json #sql-сервер

Вопрос:

У меня есть таблица, и я хочу объединить строки на основе общего идентификатора

 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 , поскольку у меня большой файл.
Любая помощь приветствуется.

Комментарии:

1. Так это SQL Server или MySQL??? «Я не добавил никаких попыток кода, поскольку я не уверен, есть ли у sql Server такой метод для создания json». Вы читали документацию???

Ответ №1:

Желаемый результат — недопустимый 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. Версия: 5.7.17

2. Спасибо, работал для верхней версии sql Server, я работаю над очень старой версией, и это проблема, с которой я сталкиваюсь, когда FOR JSON AUTO она не поддерживается

Ответ №2:

В дополнение к приведенному выше ответу, я пробовал в более старой версии, где 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"
  

Комментарии:

1. разве group_concat не является функцией MySQL?