Cómo obtener la matriz de JSON de SQL select
Aug 31 2020
Quiero obtener una matriz de objetos dentro de mi selección de 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
y obtengo esta respuesta:
[
{ 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' }
]
¿Es posible conseguir algo como esto?
[
{ 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'}] },
]
Respuestas
1 MuhammadAhmod Aug 31 2020 at 18:26
un poco oxidado, pero prueba esto:
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;
ACTUALIZACIÓN: lo anterior no es para SQLite. Para SQLite, debe consultar la extensión json1 aquí:https://www.sqlite.org/json1.html
OTRA ACTUALIZACIÓN: se puede hacer sin la extensión 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
Aquí hay un pequeño problema: la columna / nodo de colores se trata como una cadena y no como una matriz ... esto es normal ya que sqlite no admite una columna de tipo matriz. será necesario realizar un análisis para convertir de cadena a matriz ...
1 sheharbano Aug 31 2020 at 18:14
Utilice json_build_object y 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