Comment obtenir un tableau de JSON à partir de SQL Select
Aug 31 2020
Je veux obtenir un tableau d'objets à l'intérieur de ma sélection 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
et j'obtiens cette réponse:
[
{ 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' }
]
est-il possible d'obtenir quelque chose comme ça?
[
{ 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'}] },
]
Réponses
1 MuhammadAhmod Aug 31 2020 at 18:26
un peu rouillé, mais essayez ceci:
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;
MISE À JOUR: ce qui précède n'est pas pour SQLite. Pour SQLite, vous devriez vérifier l'extension json1 ici:https://www.sqlite.org/json1.html
UNE AUTRE MISE À JOUR: cela peut être fait sans l'extension 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
il y a un petit problème ici: la colonne / nœud de couleurs est traitée comme une chaîne et non comme un tableau ... c'est normal car sqlite ne prend pas en charge une colonne de type array. des analyses devront être effectuées pour convertir une chaîne en tableau ...
1 sheharbano Aug 31 2020 at 18:14
Utilisez json_build_object et 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