Расширение filter
для агрегатных функций было добавлено в Postgres 9.4 (выпущено в 2014 г.).
В более ранних версиях вы можете использовать условное выражение внутри агрегатной функции, например:
json_agg(
case when c_sch.id is not null
then json_build_object(
'id', c_sch.id,
'name', c_sch.name,
'animation', c_sch.animation,
'headerBgColor', c_sch.header_color_bg,
'headerTextColor', c_sch.header_color_text,
'headerText', c_sch.header_text,
'bodyBgColor', c_sch.body_color_bg,
'bodyCurrencyColor', c_sch.body_color_currency,
'bodyNumbersColor', c_sch.body_color_numbers,
'bodyHeadersColor', c_sch.body_color_headers,
'footerBgColor', c_sch.footer_color_bg,
'footerColor', c_sch.footer_color_text,
'footerText', c_sch.footer_text
)
end
)
Однако обратите внимание, что, как прокомментировал Ник Барнс, json_agg()
не игнорирует null
с (в отличие от других стандартных агрегатных функций, таких как min()
, max()
и т. Д.), поэтому вышеприведенный запрос не даст тот же результат, что и при использовании предложения filter
.
Одним из решений было бы перенести агрегацию в подзапрос:
select
cit.id,
cit.city,
cit.google_sheet_links,
(
select coalesce(
json_agg(
json_build_object(
'id', c_sch.id,
'name', c_sch.name,
'animation', c_sch.animation,
'headerBgColor', c_sch.header_color_bg,
'headerTextColor', c_sch.header_color_text,
'headerText', c_sch.header_text,
'bodyBgColor', c_sch.body_color_bg,
'bodyCurrencyColor', c_sch.body_color_currency,
'bodyNumbersColor', c_sch.body_color_numbers,
'bodyHeadersColor', c_sch.body_color_headers,
'footerBgColor', c_sch.footer_color_bg,
'footerColor', c_sch.footer_color_text,
'footerText', c_sch.footer_text
)
),
'[]'
)
from public.color_schemes c_sch
where c_sch.id is not null and c_sch.city_id = cit.id
) screens
from public.cities cit;