【问题标题】:How to get Array of JSON from SQL select如何从 SQL 选择中获取 JSON 数组
【发布时间】:2020-12-19 11:45:07
【问题描述】:

我想在我的 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

我得到了这样的回应:

[
  { 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' }
]

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

[
  { 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'}] },
]

【问题讨论】:

    标签: sql sqlite node-sqlite3


    【解决方案1】:

    使用 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
    

    【讨论】:

    • 你是在 sqlite 中工作的吗?因为它让我无敌
    • 不,这对 postgresql 有效。但是您可以使用此文档对其进行修改。 sqlite.org/json1.html
    【解决方案2】:

    有点生疏,但试试这个:

    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',
    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
    

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

    【讨论】:

    • 你是在 sqlite 中工作的吗?因为它让我无敌
    • 嗨 @mj 查看答案的更新...没错,它不适用于 sqlite
    • 我读了这个问题,但不知何故跳过了标签的阅读......
    猜你喜欢
    • 2014-09-27
    • 2022-01-23
    • 2014-03-02
    • 1970-01-01
    • 2016-02-03
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 2012-09-29
    相关资源
    最近更新 更多