이 가이드에서는 PostgreSQL 테이블에서 데이터를 특정 열별로 그룹화하여 JSON 개체 배열로 검색하는 방법을 보여줍니다. 예제에서는 MyTable
테이블을 참조로 사용합니다.
id | value_two | value_three | value_four |
---|---|---|---|
1 | a | A | AA |
2 | a | A2 | AA2 |
3 | b | A3 | AA3 |
4 | a | A4 | AA4 |
5 | b | A5 | AA5 |
목표는 value_three
별로 그룹화된 value_four
및 value_two
을 포함하는 각 개체가 포함된 JSON 배열을 만드는 것입니다. 원하는 출력 형식은 다음과 같습니다.
value_two | value_four |
---|---|
a | [{"value_three":"A","value_four":"AA"}, {"value_three":"A2","value_four":"AA2"}, {"value_three":"A4","value_four":"AA4"}] |
b | [{"value_three":"A3","value_four":"AA3"}, {"value_three":"A5","value_four":"AA5"}] |
최적의 솔루션은 PostgreSQL 버전에 따라 다릅니다.
PostgreSQL 10 이상:
키 제외를 위해 -
연산자를 활용하면 쿼리가 단순화됩니다.
<code class="language-sql">SELECT val2, jsonb_agg(to_jsonb(t.*) - '{id, val2}'::text[]) AS js_34 FROM tbl t GROUP BY val2;</code>
이렇게 하면 집계 전에 불필요한 열(id
및 val2
)이 효율적으로 제거됩니다.
PostgreSQL 9.4 이상:
jsonb_build_object()
더 통제된 접근 방식을 제공합니다.
<code class="language-sql">SELECT val2, jsonb_agg(jsonb_build_object('val3', val3, 'val4', val4)) AS js_34 FROM tbl GROUP BY val2;</code>
이는 각 JSON 객체에 대한 키-값 쌍을 명시적으로 지정합니다.
PostgreSQL 9.3 이상:
여러 가지 옵션이 있으며 각각 장단점이 있습니다.
to_jsonb((val3, val4))
: 결과 JSON에서 열 이름이 손실됩니다.
(val3, val4)::foo
: 사용자 정의 행 유형(foo
)으로 변환하여 열 이름을 보존합니다. CREATE TYPE foo AS (val3 text, val4 text);
사전에
하위 쿼리 접근 방식: 하위 쿼리를 사용하는 보다 장황한 방법이지만 유형 캐스팅을 피합니다.
<code class="language-sql">SELECT val2, jsonb_agg(to_jsonb((val3, val4))) AS js_34 -- Loses column names FROM tbl GROUP BY val2; -- Requires: CREATE TYPE foo AS (val3 text, val4 text); SELECT val2, jsonb_agg((val3, val4)::foo) AS js_34 -- Preserves column names FROM tbl GROUP BY val2; SELECT val2, jsonb_agg(to_jsonb((SELECT t FROM (SELECT val3, val4) t))) AS js_34 -- Subquery approach FROM tbl GROUP BY val2;</code>
PostgreSQL 버전과 원하는 간결성 수준에 가장 적합한 방법을 선택하세요. 버전 10 이상의 경우 -
연산자가 가장 깨끗하고 효율적인 솔루션을 제공합니다.
위 내용은 PostgreSQL에서 여러 열을 JSON 개체 배열로 반환하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!