Показывать и устанавливать пользовательские псевдонимы столбцов внутри json_agg

#sql #json #postgresql

#sql #json #postgresql

Вопрос:

Основываясь на следующем примере:

 WITH Table_A as (select 1 as AA),
    Table_B AS (select 2 as BB),
    Table_CD AS (select 3 as CC, 4 AS DD)
    
        
    select json_build_object(
      'X', (select json_agg(A.AA) from Table_A A)
    , 'Y', (select json_agg(B.*) from Table_B B)
    , 'Z', (select json_agg(CD.*) from Table_CD CD)
    )
  
  1. Почему, если я не указывал столбец напрямую, а использовал *, в результате отображаются имена столбцов, но когда я указываю его, он не отображается?

Результат: {"X" : [1], "Y" : [{"bb":2}], "Z" : [{"cc":3,"dd":4}]}

  1. Как (если возможно) установить пользовательский псевдоним для столбца? Так, например, результат будет

Z" : [{"custom1":3,"custom2":4}]}

  1. Как поместить значения из разных таблиц в один json_agg? Я попробовал несколько методов, но потерпел неудачу, например
  select json_build_object('XYZ', (select json_agg(CD.*, A.*) from Table_CD CD, Table_A A))
  

Ответ №1:

Я почти нахожу решение, но если какая-либо таблица возвращает более 1 строки, результаты умножаются, как этого избежать?

 WITH TableA as (select unnest(array[1,2,3,4]) as AA),
TableB AS (select 2 as BB)

SELECT  
json_build_object(
'Object1', json_agg(json_build_object('Value_1', AA)) 
,'Object2', json_agg(json_build_object('Value_2', BB)) 
)
FROM TableA A
 JOIN TableB B ON TRUE