如何使用postgres获取不同的数组元素?

时间:2016-11-16 15:50:03

标签: arrays postgresql unique postgresql-9.4

我在postgres中有一个重复值的数组。例如:

SELECT cardinality(string_to_array('1,2,3,4,4', ',')::int[]) as foo
=> "foo"=>"5"

我想获得独特的元素,例如:

SELECT cardinality(uniq(string_to_array('1,2,3,4,4', ',')::int[])) as foo
=> -- No function matches the given name and argument types. You might need to add explicit type casts.

我可以在不使用UNNEST的情况下在postgres中获取数组的唯一元素吗?

3 个答案:

答案 0 :(得分:6)

我更喜欢这种语法(大约快5%)

create or replace function public.array_unique(arr anyarray)
returns anyarray as $body$
    select array( select distinct unnest($1) )
$body$ language 'sql';

使用:

select array_unique(ARRAY['1','2','3','4','4']);

答案 1 :(得分:2)

对于整数数组,请使用intarray extension

create extension if not exists intarray;
SELECT cardinality(uniq(string_to_array('1,2,3,4,4', ',')::int[])) as foo

或功能

create or replace function public.array_unique(arr anyarray)
    returns anyarray
    language sql
as $function$
    select array_agg(distinct a)
    from (
        select unnest(arr) a 
    ) alias
$function$;

任何数组。

答案 2 :(得分:0)

关于@klin接受的答案,我修改它以在仅选择不同值的过程中删除空值。

create or replace function public.array_unique_no_nulls(arr anyarray)
returns anyarray
language sql
as $function$
select array_agg(distinct a)
from (
    select unnest(arr) a 
) alias
where a is not null
$function$;