I'd recommend the following approach which does not require the intarray
contrib module and works across all data-types.
- First examples contain a self-defined array data-type and values.
- Second examples assume there is a table with an array column present, from which the values are being pulled.
Returning Unique Values
Integers
SELECT ARRAY(SELECT DISTINCT UNNEST('{2,1,3,1,1,2}'::int[]) a) AS unique_values
-- or --
SELECT ARRAY(SELECT DISTINCT UNNEST(my_int_arr_col) a) AS unique_values FROM my_table
Returns: {2,1,3}
Text
SELECT ARRAY(SELECT DISTINCT UNNEST('{"this","is","this","some","text","is"}'::text[]) a) AS unique_values
-- or --
SELECT ARRAY(SELECT DISTINCT UNNEST(my_text_arr_col) a) AS unique_values FROM my_table
Returns: {text,this,some,is}
Dates
SELECT ARRAY(SELECT DISTINCT UNNEST('{2012-04-08,2012-04-09,2012-04-07,2012-04-08,2012-04-09}'::date[]) a) AS unique_values
-- or --
SELECT ARRAY(SELECT DISTINCT UNNEST(my_date_arr_col) a) AS unique_values FROM my_table
Returns: {2012-04-08,2012-04-09,2012-04-07}
Sorting Unique Values
If you'd like to return the values in sorted fashion, append ORDER BY a
directly after the UNNEST()
call similar to the following:
Integers
SELECT ARRAY(SELECT DISTINCT UNNEST('{2,1,3,1,1,2}'::int[]) a ORDER BY a) AS unique_values
-- or --
SELECT ARRAY(SELECT DISTINCT UNNEST(my_int_arr_col) a ORDER BY a) AS unique_values FROM my_table
Returns: {1,2,3}
Text
SELECT ARRAY(SELECT DISTINCT UNNEST('{"this","is","this","some","text","is"}'::text[]) a ORDER BY a) AS unique_values
-- or --
SELECT ARRAY(SELECT DISTINCT UNNEST(my_text_arr_col) a ORDER BY a) AS unique_values FROM my_table
Returns: {is,some,text,this}
Dates
SELECT ARRAY(SELECT DISTINCT UNNEST('{2012-04-08,2012-04-09,2012-04-07,2012-04-08,2012-04-09}'::date[]) a ORDER BY a) AS unique_values
-- or --
SELECT ARRAY(SELECT DISTINCT UNNEST(my_date_arr_col) a ORDER BY a) AS unique_values FROM my_table
Returns: {2012-04-07,2012-04-08,2012-04-09}