Cách lấy Mảng JSON từ SQL select

Aug 31 2020

Tôi muốn lấy một mảng các đối tượng bên trong lựa chọn SQL của mình.

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

và tôi nhận được phản hồi này:

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

là nó có thể nhận được một cái gì đó như thế này?

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

Trả lời

1 MuhammadAhmod Aug 31 2020 at 18:26

một chút gỉ, nhưng hãy thử điều này:

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;

CẬP NHẬT: ở trên không dành cho SQLite. Đối với SQLite, bạn nên kiểm tra phần mở rộng json1 tại đây:https://www.sqlite.org/json1.html

CẬP NHẬT KHÁC: nó có thể được thực hiện mà không cần mở rộng 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

có một vấn đề nhỏ ở đây: cột / nút màu được coi là một chuỗi chứ không phải một mảng ... điều này là bình thường vì sqlite không hỗ trợ một cột kiểu mảng. một số phân tích cú pháp sẽ cần được thực hiện để chuyển đổi từ chuỗi sang mảng ...

1 sheharbano Aug 31 2020 at 18:14

Sử dụng json_build_object và 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