Cara mendapatkan Array of JSON dari SQL pilih

Aug 31 2020

Saya ingin mendapatkan array objek di dalam SQL pilih saya.

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

dan saya mendapatkan tanggapan ini:

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

apakah mungkin mendapatkan sesuatu seperti ini?

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

Jawaban

1 MuhammadAhmod Aug 31 2020 at 18:26

agak berkarat, tapi coba ini:

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: di atas bukan untuk SQLite. Untuk SQLite, Anda harus memeriksa ekstensi json1 di sini:https://www.sqlite.org/json1.html

PEMBARUAN LAIN: ini dapat dilakukan tanpa ekstensi 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

Ada masalah kecil di sini: kolom / node warna diperlakukan sebagai string dan bukan array ... ini normal karena sqlite tidak mendukung kolom bertipe array. beberapa parsing perlu dilakukan untuk mengonversi dari string ke array ...

1 sheharbano Aug 31 2020 at 18:14

Gunakan json_build_object dan 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