How to get distinct array elements with postgres? How to get distinct array elements with postgres? postgresql postgresql

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$;