programing

PostgreSQL 반환 결과를 JSON 어레이로 설정하시겠습니까?

telebox 2023. 3. 13. 20:21
반응형

PostgreSQL 반환 결과를 JSON 어레이로 설정하시겠습니까?

나는 Postgre를 갖고 싶다.SQL은 쿼리 결과를 하나의 JSON 배열로 반환합니다.정해진

create table t (a int primary key, b text);

insert into t values (1, 'value1');
insert into t values (2, 'value2');
insert into t values (3, 'value3');

같은 것을 원합니다.

[{"a":1,"b":"value1"},{"a":2,"b":"value2"},{"a":3,"b":"value3"}]

또는

{"a":[1,2,3], "b":["value1","value2","value3"]}

(실제로 둘 다 아는 것이 더 도움이 될 것입니다).저는 몇 가지 시도를 해봤습니다.

select row_to_json(row) from (select * from t) row;
select array_agg(row) from (select * from t) row;
select array_to_string(array_agg(row), '') from (select * from t) row;

가깝다고 느끼지만 실제로는 그렇지 않아요.9.15. JSON Functions and Operators를 제외한 다른 문서를 참조해야 합니까?

그나저나, 나는 내 생각에 확신이 안 서.이것은 통상적인 설계 결정입니까?물론 위의 3가지 쿼리 중 첫 번째 결과(예를 들어)를 응용 프로그램에서 약간 조작한 후 클라이언트에 제공할 수 있다고 생각합니다만, Postgre가SQL은 최종 JSON 개체를 직접 생성할 수 있습니다. 응용 프로그램에 아직 JSON 라이브러리에 대한 종속성을 포함하지 않았기 때문에 더 간단합니다.

TL;DR

SELECT json_agg(t) FROM t

오브젝트의 JSON 배열에 대해

SELECT
    json_build_object(
        'a', json_agg(t.a),
        'b', json_agg(t.b)
    )
FROM t

어레이의 JSON 오브젝트의 경우.

오브젝트 리스트

이 섹션에서는 각 행을 단일 개체로 변환하는 개체의 JSON 배열을 생성하는 방법에 대해 설명합니다.결과는 다음과 같습니다.

[{"a":1,"b":"value1"},{"a":2,"b":"value2"},{"a":3,"b":"value3"}]

9.3 이후

json_agg을 사용법입력을 JSON으로 변환하는 방법을 자동으로 파악하여 어레이로 집약합니다.

SELECT json_agg(t) FROM t

jsonb (9.4 ')json_agg할 수 있습니다 행을 배열로 집약하여 변환할 수 있습니다.

SELECT to_jsonb(array_agg(t)) FROM t

조합합니다.json_agg스스: :

SELECT json_agg(t)::jsonb FROM t

테스트 결과, 먼저 어레이로 집약하는 것이 조금 더 빠릅니다.출연자가 JSON 결과 전체를 해석해야 하기 때문에 그런 것 같습니다.

9.2

는 9.2는 .json_agg ★★★★★★★★★★★★★★★★★」to_json사용하기 기능을 .array_to_json:

SELECT array_to_json(array_agg(t)) FROM t

에 따라 '어울리다'를 할 수 .row_to_json리리: :

SELECT array_to_json(array_agg(row_to_json(t))) FROM t

그러면 각 행이 JSON 개체로 변환되고 JSON 개체가 배열로 집계된 다음 배열이 JSON 배열로 변환됩니다.

나는 그 둘 사이에 이렇다 할 성능 차이를 알아차리지 못했다.

리스트의 오브젝트

여기에서는 JSON 오브젝트를 생성하는 방법에 대해 설명합니다.각 키는 테이블 내의 컬럼이고 각 값은 컬럼 값의 배열입니다.그 결과는 다음과 같습니다.

{"a":[1,2,3], "b":["value1","value2","value3"]}

9.5 이상

는 이이 the the를 할 수 있다.json_build_object★★★★

SELECT
    json_build_object(
        'a', json_agg(t.a),
        'b', json_agg(t.b)
    )
FROM t

열을 집계하여 단일 행을 만든 다음 이를 개체로 변환할 수도 있습니다.

SELECT to_json(r)
FROM (
    SELECT
        json_agg(t.a) AS a,
        json_agg(t.b) AS b
    FROM t
) r

오브젝트가 원하는 이름을 가지도록 하려면 어레이의 에일리어스가 반드시 필요합니다.

어느 쪽이 더 명확한지는 의견의 문제이다.json_build_object가독성을 높이기 위해 키/값 쌍을 한 줄에 둘 것을 강력히 권장합니다.

,도할 수 .array_aggjson_agg, " ", " " 가 검출되었습니다.json_agg조금 더 빠릅니다.

jsonbjson_build_object 다음과 같이 변환할 수 .단일 행으로 집계하여 다음과 같이 변환할 수 있습니다.

SELECT to_jsonb(r)
FROM (
    SELECT
        array_agg(t.a) AS a,
        array_agg(t.b) AS b
    FROM t
) r

이런 종류의 결과에 대한 다른 질문들과는 달리array_agg 더 것 같아요.to_jsonbjson_agg.

또는 명시적 캐스트를 사용할 수 있습니다.

SELECT
    json_build_object(
        'a', json_agg(t.a),
        'b', json_agg(t.b)
    )::jsonb
FROM t

to_jsonb버전에서는 캐스트를 회피할 수 있고, 테스트 결과도 고속입니다.다시 말씀드리지만, 이것은 해석과 결과의 검증의 오버헤드에 의한 것이라고 생각됩니다.

9.4 및 9.3

json_build_object는 9버전에서는 및 .

SELECT to_json(r)
FROM (
    SELECT
        json_agg(t.a) AS a,
        json_agg(t.b) AS b
    FROM t
) r

또는

SELECT to_jsonb(r)
FROM (
    SELECT
        array_agg(t.a) AS a,
        array_agg(t.b) AS b
    FROM t
) r

이 에 따라json ★★★★★★★★★★★★★★★★★」jsonb.

에는 (9.3)이 .jsonb

9.2

에서는 9.2도 to_json 하다.써야 해요.row_to_json:

SELECT row_to_json(r)
FROM (
    SELECT
        array_agg(t.a) AS a,
        array_agg(t.b) AS b
    FROM t
) r

문서

JSON 함수의 JSON 함수에 대한 설명서를 찾습니다.

json_agg는 함수 집약 페이지에 있습니다.

설계.

성능이 중요한 경우, 내 테스트를 신뢰하지 말고 자체 스키마 및 데이터에 대해 쿼리를 벤치마킹하십시오.

좋은 디자인인지 아닌지는 고객님의 용도에 따라 다릅니다.유지보수에 관해서는 특별히 문제가 없다고 생각합니다.이는 앱 코드를 단순화하고 앱의 해당 부분에서 유지 보수할 필요가 적다는 것을 의미합니다.PG가 필요한 결과를 바로 제공할 수 있다면 사용하지 않는 이유는 퍼포먼스에 대한 고려뿐입니다.수레바퀴를 재발명하지 마세요.

특수한 순서

됩니다.NULL0 ★★★★★★★★★★★★★★★★★★★★★★★★★이것이 가능하다면, 다음을 사용하는 것이 좋습니다.COALESCE들을을피피피피피들 수 있습니다.

SELECT COALESCE(json_agg(t), '[]'::json) FROM t

또는

SELECT to_jsonb(COALESCE(array_agg(t), ARRAY[]::t[])) FROM t

Hannes Landeholm지적한 공로

또한 테이블에서 선택한 필드를 배열로 집계하는 경우에도 다음을 수행합니다.

SELECT json_agg(json_build_object('data_a',a,
                                  'data_b',b,
))  from t;

결과는 다음과 같습니다.

 [{'data_a':1,'data_b':'value1'}
  {'data_a':2,'data_b':'value2'}]

언급URL : https://stackoverflow.com/questions/24006291/postgresql-return-result-set-as-json-array

반응형