... Где statandard библиотеки (?) Для этого вида array_X утилита ??
Попробуйте поискать ... См. Некоторые, но не стандартные:
Самый простой и быстрый array_distinct()
Функция snippet-lib
Здесь самая простая и, возможно, более быстрая реализация для array_unique()
или array_distinct()
:
CREATE FUNCTION array_distinct(anyarray) RETURNS anyarray AS $f$
SELECT array_agg(DISTINCT x) FROM unnest($1) t(x);
$f$ LANGUAGE SQL IMMUTABLE;
ПРИМЕЧАНИЕ: он работает, как и ожидалось, с любым типом данных, кроме массива массивов,
SELECT array_distinct( array[3,3,8,2,6,6,2,3,4,1,1,6,2,2,3,99] ),
array_distinct( array['3','3','hello','hello','bye'] ),
array_distinct( array[array[3,3],array[3,3],array[3,3],array[5,6]] );
-- "{1,2,3,4,6,8,99}", "{3,bye,hello}", "{3,5,6}"
«побочный эффект» - взорвать все массивы в наборе элементов.
PS: с массивами JSONB работает нормально,
SELECT array_distinct( array['[3,3]'::JSONB, '[3,3]'::JSONB, '[5,6]'::JSONB] );
-- "{"[3, 3]","[5, 6]"}"
Редактировать: более сложный, но полезный параметр "drop nulls"
CREATE FUNCTION array_distinct(
anyarray, -- input array
boolean DEFAULT false -- flag to ignore nulls
) RETURNS anyarray AS $f$
SELECT array_agg(DISTINCT x)
FROM unnest($1) t(x)
WHERE CASE WHEN $2 THEN x IS NOT NULL ELSE true END;
$f$ LANGUAGE SQL IMMUTABLE;