下列
SELECT ARRAY[a,b,c,d]
FROM ( VALUES
('foo', 'bar', 'foo', 'baz' )
) AS t(a,b,c,d);
Run Code Online (Sandbox Code Playgroud)
{foo,bar,foo,baz}
类型的返回text[]
。我想获得删除重复元素之一的{foo,bar,baz}
类型?PostgreSQL 是否有一个独特的函数可以处理文本数组或of ?text[]
bar
anyarray
anyelement
Eva*_*oll 21
虽然没有实现这一点的功能,但您可以使用
unnest()
将元素数组转换为一列的行表,DISTINCT
删除重复项ARRAY(query)
重新创建行。这个成语看起来像,
ARRAY( SELECT DISTINCT ... FROM unnest(arr) )
Run Code Online (Sandbox Code Playgroud)
在实践中是这样应用的,
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);
Run Code Online (Sandbox Code Playgroud)
如果你想要它排序,你可以做,
SELECT ARRAY(SELECT DISTINCT e FROM unnest(ARRAY[a,b,c,d]) AS a(e) ORDER BY e)
FROM ( VALUES
('foo', 'bar', 'foo', 'baz' )
) AS t(a,b,c,d);
Run Code Online (Sandbox Code Playgroud)
而这一切可以能写有CROSS JOIN LATERAL
这多的清洁剂,
SELECT ARRAY(
SELECT DISTINCT e
FROM ( VALUES
('foo', 'bar', 'foo', 'baz' )
) AS t(a,b,c,d)
CROSS JOIN LATERAL unnest(ARRAY[a,b,c,d]) AS a(e)
-- ORDER BY e; -- if you want it sorted
);
Run Code Online (Sandbox Code Playgroud)