Несколько полезных функций: if, first, last.if(<условие выполняется?>, <да>, [<нет>])Компактная альтернатива конструкции CASE. Последний аргумент необязательный, если нужно вернуть NULL в случае невыполнения условия.CREATE OR REPLACE FUNCTION public.if(boolean, anycompatible, anycompatible DEFAULT NULL::unknown) RETURNS anycompatible LANGUAGE sql IMMUTABLE PARALLEL SAFE AS $function$ SELECT CASE WHEN $1 THEN $2 ELSE $3 END $function$;first(<значение>)Агрегатная функция возвращает первое значение отличное от NULL. Работает с оконными функциями и типом BOOLEAN.CREATE OR REPLACE FUNCTION public.first_agg(anyelement, anyelement) RETURNS anyelement LANGUAGE sql IMMUTABLE PARALLEL SAFE STRICT AS $function$ SELECT $1 $function$; CREATE OR REPLACE AGGREGATE public.first(pg_catalog.anyelement) ( SFUNC = first_agg, STYPE = anyelement );last(<значение>)Агрегатная функция возвращает последнее значение отличное от NULL. Работает с оконными функциями и типом BOOLEAN.CREATE OR REPLACE FUNCTION public.last_agg(anyelement, anyelement) RETURNS anyelement LANGUAGE sql IMMUTABLE PARALLEL SAFE STRICT AS $function$ SELECT $2 $function$; CREATE OR REPLACE AGGREGATE public.last(pg_catalog.anyelement) ( SFUNC = last_agg, STYPE = anyelement );