如何从SQL select获取JSON数组

问题描述

我想在我的sql select中获取一个对象数组。

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

然后我得到以下答复:

[
  { id: 1,antibodyName: 'antibody 1',colorName: 'red',colorLocation: 'A5/C3' },{ id: 2,antibodyName: 'antibody 2',colorLocation: 'C3/A1' },colorName: 'yellow',colorLocation: 'E4/F2' }
]

有可能得到这样的东西吗?

[
  { id: 1,colors: [{name: 'red,location: 'A5/C3'}] },location: 'C3/A1'},{name: 'yellow',location: 'E4/F2'}] },]

解决方法

使用json_build_object和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
,

有点生锈,但是尝试一下:

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;

更新:以上内容不适用于SQLite。对于SQLite,您应该在此处签出json1扩展名:https://www.sqlite.org/json1.html

另一个更新: 无需JSON扩展就可以完成...

SELECT
a.id AS 'id',(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

这里还有一个小问题:colors列/节点被视为字符串而不是数组...这是正常现象,因为sqlite不支持array类型的列。要从字符串转换为数组,需要进行一些解析...