数组是 PostgreSQL 中一个很好用的数据类型,但官方并未提供类似于 array_distinct 之类的数组去重函数,我们可以通过以下操作来实现该功能:
- 使用 unnest() 将数组转换为一组数据行
- 使用 DISTINCT 移除重复项
- 使用 ARRAY(query) 将行再转为数组
ARRAY( SELECT DISTINCT ... FROM unnest(arr) )
一个可运行的 SQL 语句如下:
SELECT ARRAY(SELECT DISTINCT e FROM unnest(ARRAY[a,b,c,d]) AS a(e)) FROM ( VALUES ('foo', 'bar', 'foo', 'baz' ) ) AS t(a,b,c,d);
以下代码会创建一个名为 array_distinct 自定义函数:
CREATE OR REPLACE FUNCTION "public"."array_distinct"(anyarray) RETURNS "pg_catalog"."anyarray" AS $BODY$ SELECT ARRAY(SELECT DISTINCT unnest($1)); $BODY$ LANGUAGE sql VOLATILE COST 100
调用示例如下:
SELECT array_distinct ( ARRAY [ 'A', 'B', 'C', '1', 'A' ]:: VARCHAR [] )