數組是 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 [] )