Как получить массив JSON из SQL select

Aug 31 2020

Я хочу получить массив объектов внутри моего выбора SQL.

SELECT id, a.name antibodyName, c.name colorName, c.location colorLocation 
FROM Antibodies a 
JOIN AssignedColors c ON id = antiId 
WHERE colorId IS NOT NULL

и я получаю такой ответ:

[
  { id: 1, antibodyName: 'antibody 1', colorName: 'red', colorLocation: 'A5/C3' },
  { id: 2, antibodyName: 'antibody 2', colorName: 'red', colorLocation: 'C3/A1' },
  { id: 2, antibodyName: 'antibody 2', colorName: 'yellow', colorLocation: 'E4/F2' }
]

возможно ли получить что-то подобное?

[
  { id: 1, antibodyName: 'antibody 1', colors: [{name: 'red, location: 'A5/C3'}] },
  { id: 2, antibodyName: 'antibody 2', colors: [{name: 'red, location: 'C3/A1'}, {name: 'yellow', location: 'E4/F2'}] },
]

Ответы

1 MuhammadAhmod Aug 31 2020 at 18:26

немного ржавый, но попробуйте следующее:

SELECT
a.id AS 'Id',
a.Name AS 'antibodyName',
c.Name AS 'name',
c.location AS 'location'
FROM Antibodies a
LEFT JOIN AssignedColors c ON c.id = a.Id
FOR JSON AUTO;

ОБНОВЛЕНИЕ: приведенное выше не для SQLite. Для SQLite вы должны проверить расширение json1 здесь:https://www.sqlite.org/json1.html

ДРУГОЕ ОБНОВЛЕНИЕ: это можно сделать без расширения JSON ...

SELECT
a.id AS 'id',
a.Name AS 'antibodyName',
(SELECT '[' || GROUP_CONCAT('{name:"' || Name || '", location:"' || location || '"}') ||']'
 FROM AssignedColors
 WHERE c.id=Id) AS colors
 FROM Antibodies a
 LEFT JOIN AssignedColors c ON c.id = a.id
 GROUP BY a.id

Здесь есть небольшая проблема: столбец / узел цветов обрабатывается как строка, а не как массив ... это нормально, поскольку sqlite не поддерживает столбец типа array. потребуется выполнить некоторый синтаксический анализ, чтобы преобразовать строку в массив ...

1 sheharbano Aug 31 2020 at 18:14

Используйте json_build_object и array_agg.

WITH foobar AS ( 
    SELECT id, a.name antibodyName, c.name colorName, c.location colorLocation 
    FROM Antibodies a JOIN AssignedColors c
    ON id = antiId WHERE colorId IS NOT NULL
    )
SELECT 
     json_build_object('data',array_agg(json_build_object('id', id, 'antibodyName', antibodyName, 'colorName', colorName, 'colorLocation', colorLocation))
FROM 
    foobar