How to get distinct array elements with postgres?
I prefer this syntax (about 5% faster)
create or replace function public.array_unique(arr anyarray)returns anyarray as $body$ select array( select distinct unnest($1) )$body$ language 'sql';
using:
select array_unique(ARRAY['1','2','3','4','4']);
For integer arrays use intarray extension:
create extension if not exists intarray;select cardinality(uniq(string_to_array('1,2,3,4,4', ',')::int[])) as foo
or the function
create or replace function public.array_unique(arr anyarray) returns anyarray language sqlas $function$ select array_agg(distinct elem) from unnest(arr) as arr(elem) $function$;
for any array. You can easily modify the function to preserve the original order of the array elements:
create or replace function public.array_unique_ordered(arr anyarray) returns anyarray language sqlas $function$ select array_agg(elem order by ord) from ( select distinct on(elem) elem, ord from unnest(arr) with ordinality as arr(elem, ord) order by elem, ord ) s$function$;
Example:
with my_data(arr) as (values ('{d,d,a,c,b,b,a,c}'::text[]))select array_unique(arr), array_unique_ordered(arr)from my_data array_unique | array_unique_ordered--------------+---------------------- {a,b,c,d} | {d,a,c,b}(1 row)
Going off of @klin's accepted answer, I modified it to remove nulls in the process of choosing only the distinct values.
create or replace function public.array_unique_no_nulls(arr anyarray)returns anyarraylanguage sqlas $function$select array_agg(distinct a)from ( select unnest(arr) a ) aliaswhere a is not null$function$;