So erhalten Sie ein Array von JSON aus SQL Select

Aug 31 2020

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

1 MuhammadAhmod Aug 31 2020 at 18:26

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 ...

1 sheharbano Aug 31 2020 at 18:14

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