programing

개체의 JSON 배열과 동일한 행의 여러 열을 반환합니다.

easyjava 2023. 2. 23. 23:07
반응형

개체의 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.value_two그 결과 스스로 존재해야 합니다.결과는 다음과 같습니다.

 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"}]

사용 여부는 중요하지 않습니다.json_agg()또는array_agg().

하지만 제가 할 수 있는 일은

with MyCTE as ( select value_two, value_three, value_four from MyTable ) 
select value_two, json_agg(row_to_json(MyCTE)) value_four 
from MyCTE 
group by value_two;

반환되는 내용:

 value_two │                                                                                    value_four                                                                                 
───────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 a         │ [{"value_two":"a","value_three":"A","value_four":"AA"}, {"value_two":"a","value_three":"A2","value_four":"AA2"}, {"value_two":"a","value_three":"A4","value_four":"AA4"}]
 b         │ [{"value_two":"b","value_three":"A3","value_four":"AA3"}, {"value_two":"b","value_three":"A5","value_four":"AA5"}]

엑스트라 포함value_two오브젝트 키를 눌러서 삭제하겠습니다.사용해야 하는 SQL(Postgres) 쿼리를 선택하십시오.

json_build_object() Postgres 9.4 이후

또는 되돌아가기 위해jsonb.

SELECT value_two, json_agg(json_build_object('value_three', value_three
                                           , 'value_four' , value_four)) AS value_four
FROM   mytable 
GROUP  BY value_two;

매뉴얼:

가변 인수 목록에서 JSON 개체를 만듭니다.관례상 인수 리스트는 키와 값을 번갈아 사용하여 구성됩니다.

모든 버전(포함)포스트그레스 9.3)

row_to_json() 그런 표정을 지으면 효과가 있을 것이다.

SELECT value_two
     , json_agg(row_to_json((value_three, value_four))) AS value_four
FROM   mytable
GROUP  BY value_two;

그러나 원래 열 이름은 손실됩니다.등록된 행 유형에 대한 캐스트는 이를 회피합니다(임시 테이블의 행 유형은 애드혹 쿼리에도 사용됩니다).

CREATE TYPE foo AS (value_three text, value_four text);  -- once in the same session
SELECT value_two
     , json_agg(row_to_json((value_three, value_four)::foo)) AS value_four
FROM   mytable
GROUP  BY value_two;

또는 서브셀렉트 대신 서브셀렉트를 사용합니다.ROW표현.좀 더 상세하게, 그러나 유형 캐스팅은 제외:

SELECT value_two
     , json_agg(row_to_json((SELECT t FROM (SELECT value_three, value_four) t))) AS value_four
FROM   mytable
GROUP  BY value_two;

Craig 관련 답변에 대한 자세한 내용은 다음과 같습니다.

db <>여기에 추가
올드 스클피들

to_json with array_composite type

begin;
create table  mytable(
id bigint, value_two text, value_three text, value_four  text);
insert into mytable(id,value_two, value_three,value_four)
values
 ( 1, 'a',       'A',           'AA'),
  (2, 'a'    ,     'A2'  ,       'AA2'),
  (3, 'b'  ,       'A3',         'AA3'),
 ( 4, 'a'   ,      'A4',          'AA4'),
  (5, 'b' ,        'A5',          'AA5');
commit;
create type mytable_type as (value_three text, value_four text);

select value_two,
       to_json( array_agg(row(value_three,value_four)::mytable_type))
from mytable
group by 1;

언급URL : https://stackoverflow.com/questions/26486784/return-multiple-columns-of-the-same-row-as-json-array-of-objects

반응형