我有一个类型bigint的数组,如何删除该数组中的重复值?
例如:array [1234,5343,6353,1234,1234]
我应该得到数组[1234,5343,6353,…]
我在postgres手册中测试了示例SELECT uniq(sort(‘{1,2,3,1}’:int [])),但它不工作。
sort(int [])和uniq(int [])函数由intarray contrib模块提供。
要启用它,您必须通过执行可以在postgresql安装的contrib目录中找到的_int.sql文件来注册模块。
在Debian / Ubuntu系统上,您必须安装postgresql-contrib-8.4软件包,然后该文件将位于/usr/share/postgresql/8.4/contrib/_int.sql(版本号可能不同)
如果你不想使用intarray contrib模块,或者你必须从不同类型的数组中删除重复,你还有另外两种方法。
如果你至少有Postgresql 8.4,你可以利用unnest(anyarray)函数
- SELECT ARRAY(SELECT DISTINCT UNNEST('{1,1}'::int[]) ORDER BY 1);
- ?column?
- ----------
- {1,3}
- (1 row)
或者,你可以创建自己的函数来做到这一点
- CREATE OR REPLACE FUNCTION array_sort_unique (ANYARRAY) RETURNS ANYARRAY
- LANGUAGE sql
- AS $body$
- SELECT ARRAY(
- SELECT DISTINCT $1[s.i]
- FROM generate_series(array_lower($1,1),array_upper($1,1)) AS s(i)
- ORDER BY 1
- );
- $body$;
这里是一个示例调用:
- SELECT array_sort_unique('{1,1}'::int[]);
- array_sort_unique
- -------------------
- {1,3}
- (1 row)