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_agg
json_agg
, " ", " " 가 검출되었습니다.json_agg
조금 더 빠릅니다.
jsonb
의 json_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_jsonb
json_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가 필요한 결과를 바로 제공할 수 있다면 사용하지 않는 이유는 퍼포먼스에 대한 고려뿐입니다.수레바퀴를 재발명하지 마세요.
특수한 순서
됩니다.NULL
0 ★★★★★★★★★★★★★★★★★★★★★★★★★이것이 가능하다면, 다음을 사용하는 것이 좋습니다.COALESCE
들을을피피피피피들 수 있습니다.
SELECT COALESCE(json_agg(t), '[]'::json) FROM t
또는
SELECT to_jsonb(COALESCE(array_agg(t), ARRAY[]::t[])) FROM t
또한 테이블에서 선택한 필드를 배열로 집계하는 경우에도 다음을 수행합니다.
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
'programing' 카테고리의 다른 글
HTML 페이지에서 데이터를 React 컴포넌트로 전달하는 올바른 방법이 있습니까? (0) | 2023.03.13 |
---|---|
레일에서 JSON 문자열을 JSON 어레이로 변환하시겠습니까? (0) | 2023.03.13 |
부분 뷰를 바인딩하기 위해 ko.applyBindings를 호출할 수 있습니까? (0) | 2023.03.13 |
http에서 JSON 응답을 얻는 방법.얻다 (0) | 2023.03.13 |
SQL에서 JSON으로 - SQL 2016에서 객체 배열에서 값 배열로 (0) | 2023.03.13 |