불행히도 SQL 구문에는 "이 하나의 열을 제외한 모든 열" 을 말하는 규정이 없습니다 . 행 유형 표현식 에서 나머지 열 목록을 철자하여 목표를 달성 할 수 있습니다 .
SELECT a.id, a.name
, json_agg((b.col1, b.col2, b.col3)) AS item
FROM a
JOIN b ON b.item_id = a.id
GROUP BY a.id, a.name;
보다 명확한 형식은 짧습니다 . ROW
(b.col1, b.col2, b.col3)
그러나 열 이름 은 행 유형 표현식에서 유지되지 않습니다. 이런 식으로 JSON 객체에서 일반 키 이름을 얻습니다. 원래 열 이름을 유지하는 세 가지 옵션이 있습니다.
1. 등록 된 유형으로 캐스트
잘 알려진 (등록 된) 행 유형으로 캐스트합니다. 유형은 기존의 모든 테이블 또는 뷰에 대해 또는 명시적인 CREATE TYPE
명령문으로 등록됩니다. 임시 솔루션에 임시 테이블을 사용할 수 있습니다 (세션 기간 동안 지속됨).
CREATE TEMP TABLE x (col1 int, col2 text, col3 date); -- use adequate data types!
SELECT a.id, a.name
, json_agg((b.col1, b.col2, b.col3)::x) AS item
FROM a
JOIN b ON b.item_id = a.id
GROUP BY a.id, a.name;
2. 부속 선택을 사용하십시오
subselect를 사용하여 파생 테이블 을 구성하고 테이블 전체를 참조하십시오 . 이것은 또한 열 이름을 전달합니다. 더 장황하지만 등록 된 유형이 필요하지 않습니다.
SELECT a.id, a.name
, json_agg((SELECT x FROM (SELECT b.col1, b.col2, b.col3) AS x)) AS item
FROM a
JOIN b ON b.item_id = a.id
GROUP BY a.id, a.name;
SELECT a.id, a.name
, json_agg(json_build_object('col1', b.col1, 'col2', b.col2, 'col3', b.col3)) AS item
FROM a
JOIN b ON b.item_id = a.id
GROUP BY a.id, a.name;
관련 :
jsonb
각 기능 jsonb_agg()
과 유사합니다 jsonb_build_object()
.
들어 포스트 그레스 9.5 도 참조 이상 a_horse의 답변을 새로운 짧은 구문 변종 : 포스트 그레스 추가 된 마이너스 연산자 -
에 대한jsonb
대답 "이 하나의 키를 제외한 모든 키를" .
이후 포스트 그레스 10 "여러 개의 키를 제외한" 동일한 조작 복용 구현 text[]
2 피연산자 - MLT는 주석 등을들 수있다.