So erhalten Sie ein Array von JSON aus SQL Select
Ich möchte ein Array von Objekten in meiner SQL-Auswahl erhalten.
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
und ich bekomme diese Antwort:
[
{ 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' }
]
ist es möglich so etwas zu bekommen?
[
{ 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'}] },
]
Antworten
ein bisschen rostig, aber versuchen Sie dies:
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;
UPDATE: Das obige gilt nicht für SQLite. Für SQLite sollten Sie die Erweiterung json1 hier auschecken:https://www.sqlite.org/json1.html
EIN ANDERES UPDATE: Es kann ohne die JSON-Erweiterung durchgeführt werden ...
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
Hier gibt es ein kleines Problem: Die Farbspalte / der Farbknoten wird als Zeichenfolge und nicht als Array behandelt. Dies ist normal, da SQLite keine Spalte vom Typ Array unterstützt. Es muss etwas analysiert werden, um von einem String in ein Array zu konvertieren ...
Verwenden Sie json_build_object und 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