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