#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)
)
- Почему, если я не указывал столбец напрямую, а использовал *, в результате отображаются имена столбцов, но когда я указываю его, он не отображается?
Результат:
{"X" : [1], "Y" : [{"bb":2}], "Z" : [{"cc":3,"dd":4}]}
- Как (если возможно) установить пользовательский псевдоним для столбца? Так, например, результат будет
Z" : [{"custom1":3,"custom2":4}]}
- Как поместить значения из разных таблиц в один 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