Come ottenere Array of JSON da SQL select
Aug 31 2020
Voglio ottenere una serie di oggetti all'interno della mia selezione 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
e ottengo questa risposta:
[
{ 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' }
]
è possibile ottenere qualcosa di simile?
[
{ 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'}] },
]
Risposte
1 MuhammadAhmod Aug 31 2020 at 18:26
un po 'arrugginito, ma prova questo:
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;
AGGIORNAMENTO: quanto sopra non è per SQLite. Per SQLite dovresti controllare l'estensione json1 qui:https://www.sqlite.org/json1.html
UN ALTRO AGGIORNAMENTO: può essere fatto senza l'estensione 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
c'è un piccolo problema qui: la colonna / nodo dei colori viene trattata come una stringa e non come un array ... questo è normale poiché sqlite non supporta una colonna di tipo array. sarà necessario eseguire alcune analisi per convertire da stringa a array ...
1 sheharbano Aug 31 2020 at 18:14
Usa json_build_object e 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