SQL select에서 JSON 배열을 얻는 방법

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 확장없이 수행 할 수 있습니다 ...

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가 배열 유형의 열을 지원하지 않기 때문에 이것은 정상입니다. 문자열에서 배열로 변환하려면 일부 구문 분석을 수행해야합니다.

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