SQL से JSON का Array कैसे प्राप्त करें

Aug 31 2020

मैं अपने 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'}] },
]

जवाब

1 MuhammadAhmod Aug 31 2020 at 18:26

थोड़ा कठोर, लेकिन यह कोशिश करो:

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 extention के बिना किया जा सकता है ...

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 doesnt प्रकार के कॉलम के स्तंभ का समर्थन नहीं करता है। स्ट्रिंग से एरे में बदलने के लिए कुछ पार्सिंग की आवश्यकता होगी ...

1 sheharbano Aug 31 2020 at 18:14

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